java - @ManyToMany 启动 LazyInitializationException

标签 java hibernate jpa many-to-many lazy-evaluation

出于某些测试目的,我尝试让 JUnit 测试抛出 LazyInitializationException。

我的情况是我有 3 个实体

@Entity(name = "Role")
public class Role {
    @LazyCollection(LazyCollectionOption.TRUE)
    @ManyToMany(mappedBy = "roles", fetch=FetchType.LAZY)
    private Set<AppUser> appUsers;
    ...

}

@Entity(name = "Group")
public class Group {
    @LazyCollection(LazyCollectionOption.TRUE)
    @ManyToMany(mappedBy = "groups", fetch=FetchType.LAZY)
    private Set<AppUser> appUsers;
    ...
}

@Entity(name = "AppUser")
public class AppUser {
    @LazyCollection(LazyCollectionOption.TRUE)
    @ManyToMany(fetch= FetchType.LAZY)
    @JoinTable(name = "APPUSER_ROLE", joinColumns = @JoinColumn(name = "USER_ID", referencedColumnName = "ID"), inverseJoinColumns = @JoinColumn(name = "ROLE_ID", referencedColumnName = "ID"))
    private Set<Role> roles;
    ...

    @LazyCollection(LazyCollectionOption.TRUE)
    @ManyToMany(fetch= FetchType.LAZY)
    @JoinTable(name = "APPUSER_GROUP", joinColumns = @JoinColumn(name = "USER_ID", referencedColumnName = "ID"), inverseJoinColumns = @JoinColumn(name = "GROUP_ID", referencedColumnName = "ID"))
    private Set<Group> groups;
    ...

} 

我生成了一些测试数据,其中所有这 3 个数据都通过关系正确地保存在数据库中。然后我提交交易。

但是后来我尝试使用相同的测试方法来读取Role(基于id),但我还读取了所有其他相关实体(似乎急切地加载)。为什么会这样呢?我怎样才能遇到LazyInitializationException

编辑:好的,我对一般描述不感兴趣,而是需要一个代码示例,因为我无法在我的情况下启动它。一般描述不能解决我的问题。

最佳答案

How can I come to LazyInitializationException?

当你有:

  1. 延迟加载的实体成员(例如 OneToMany 或 ManyToMany)
  2. 没有 Activity 事务(实体已分离)
  3. 该成员尚未加载
  4. 您尝试访问实体成员,这应该会触发延迟加载,但这是不可能的,因为实体已分离

关于java - @ManyToMany 启动 LazyInitializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13341861/

相关文章:

java - 使用复合备用键映射多对一关系

database - Spring - PersistenceContext - 没有可用的事务性 EntityManager

java - 类内部的序列化

java.lang.IllegalStateException : getInputStream() has already been called for this request

java - jQuery 的 datepicker 插件不会将值发送到 Struts 2 后端

java - JPA/Hibernate 在启动期间挂起 native 文件系统操作

java - Apache Tomcat 启动错误 : during deploying web application

java - 将 Quarkus 和 Hibernate 与 db2/400 结合使用

java - 导入 Kafka MockAdminClient 以使用 Maven 对我的 Kafka 应用程序进行单元测试

java - 如何在 spring 数据 jpa 规范中将枚举作为字符串处理