java - 克服 Hibernate 中的延迟加载问题,多对多关系

标签 java hibernate

自学 Hibernate,我有以下表结构/关系

Relationship

由以下类表示...

用户

@Entity
@Table(name = "users")
public class User implements IUser<Role>, Serializable {

    @Id
    @GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY)
    @SequenceGenerator(name = "user_key_seq")
    @Column(name = "key", insertable = false, updatable = false)
    private Long key;

    @Column(name = "name")
    private String name;

    @ManyToMany(cascade = {CascadeType.ALL})
    @JoinTable(name = "userroles",
                    joinColumns = {
                        @JoinColumn(name = "userkey")},
                    inverseJoinColumns = {
                        @JoinColumn(name = "rolekey")})
    private Set<Role> roles = new HashSet<>(5);

    @Override
    public Set<Role> getRoles() {
        return roles;
    }

    // Other setters and getters

}

角色

@Entity
@Table(name = "roles")
public class Role implements IRole, Serializable {

    @Id
    @GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY)
    @SequenceGenerator(name = "roles_key_seq")
    @Column(name = "key", insertable = false, updatable = false)
    private Long key;

    @Column(name="name")
    private String name;

    @ManyToMany(cascade = {CascadeType.ALL})
    @JoinTable(name="parentroles",
                    joinColumns = {@JoinColumn(name="childkey")},
                    inverseJoinColumns = {@JoinColumn(name="parentkey")})
    private Set<Role> roles = new HashSet<>(5);

    // Other setters and getters

}

我遇到的问题是...

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: org.kaizen.chishiki.core.data.User.roles, could not initialize proxy - no Session
    at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:575)
    at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:214)
    at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:554)
    at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:142)
    at org.hibernate.collection.internal.PersistentSet.iterator(PersistentSet.java:180)
    at og.kaizen.chishiki.core.testdatacore.Main.<init>(Main.java:37)
    at og.kaizen.chishiki.core.testdatacore.Main.main(Main.java:25)

现在,我知道我可以设置 fetch输入 FetchType.EAGER ,但我不想这样做,除了性能问题,我正在努力学习解决这些问题的方法;)

我想知道是否有一种方法可以编写 Hibernate 查询来满足这种关系并手动加载行(它还允许我返回 Role 的接口(interface)而不是我必须做的实现现在(将允许我维持该契约(Contract)))。

根据我的阅读,我似乎需要构建一个 Entity对于 UserRoles .并不是说我反对这个解决方案,但我很好奇是否有办法绕过它。

roles出现在其他一些关系中,所以没办法和父表形成直接关系(就是我不能把父表的key直接放到role表里,另外, users 可以有多个 roles )

我想到的另一个解决方案是编写一个存储过程来为我做这件事。虽然这是一个可行的解决方案,我并没有放弃,但它确实使将应用程序迁移到另一个数据库变得更加困难,而不是阻碍,但我试图将这些想法牢记在心。

最佳答案

如果你想用他们的角色加载用户,但仍然保持惰性关联,使用包含 left join fetch 的 HQL 查询:

select u from User u left join fetch u.roles where ...

如果您有一个 User 并想确保在关闭 session 之前初始化其角色集合,请调用 Hibernate.initialize(user.getRoles())

关于java - 克服 Hibernate 中的延迟加载问题,多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24664388/

相关文章:

java - 如何将 JQPL 查询转换为 DTO?

java - 一旦外键是主键的一部分,如何使用复合键映射自连接

java - 当 `!` 应用于 `&&` 或 `||` 时,什么简化了表达式

java - 尝试使用 LibGDX 登录 GooglePlay 游戏服务时出现 "signInSilently(): failure"

java - 使用注释扩展 hibernate 实体

java - 向 hibernate 映射文件添加属性

Hibernate 映射资源位于单独的 jar 中

java - JFrame 不等待 JOptionPane 执行

Java Selenium 查找元素(xpath)

Java从String解析许多子串实例