【问题标题】:LazyInitializationException when using @Inheritance使用 @Inheritance 时出现 LazyInitializationException
【发布时间】:2022-01-15 10:09:42
【问题描述】:

我正在尝试通过这个项目https://github.com/Baeldung/spring-security-registration 使用继承。

这是我的用户:

@Data
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING, name = "TYPE")
public abstract class User {
     @ManyToMany(fetch = FetchType.EAGER)
     @JoinTable(name = "users_roles",joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"))
     private Collection<Role> roles;
}

还有一些像 UserAdmin 这样的子类:

@Entity
@DiscriminatorValue("ADMIN")
public class UserAdmin extends User {}

那么我的角色类是这样的:

@Data
@Entity
public class Role {
     @ManyToMany(mappedBy = "roles")
     private Collection<User> users;
}

但是我在注册用户时遇到了这个错误:

o.h.LazyInitializationException:无法延迟初始化角色集合:com.baeldung.persistence.model.Role.users,无法初始化代理 - 没有会话

需要帮助的人。

【问题讨论】:

  • 当你做多对多关系时,他们必须懒惰地评估,因为你不能同时添加 2 个循环数据。检查你的代码,看看你在哪里错过了这个要求

标签: java spring jpa


【解决方案1】:

我们需要更多的上下文,但您通常有两种选择:

  1. 使用@Transactional 注释调用“getRoles()”的方法。

  1. 在 jpa 中使用 @Query("SELECT u from user u join fetch u.roles where u.id =:id") 创建一个方法。

【讨论】:

  • 感谢您的回复。我刚刚下载了项目并介绍了 UserAdmin 和 UserStaff。调用 RegistrationController#confirmRegistration 时出错
  • 我在 RegistrationController#authWithoutPassword 中添加了注解,但仍然出现错误
  • 我刚刚注意到该项目有点复杂,我认为如果您要在 RegistrationController#confirmRegistration 上添加@Transactional,它应该仍然有效。但这是一种不好的做法
  • 确实,添加此注释不是一个好习惯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多