Hibernate,fetch,HQL和hashCode()

Jus*_*yul 1 java hibernate

我有一个HQL查询的东西ala'

SELECT myclass 
FROM 
    MyClass myclass JOIN FETCH 
    myclass.anotherset sub JOIN FETCH 
    sub.yetanotherset
...
Run Code Online (Sandbox Code Playgroud)

因此,类MyClass有一个属性"anotherset",它是一个包含另一个类的实例的集合,我们称之为MyClassTwo.而且,类MyClassTwo有一个属性yetanotherset,它是一组第三类类(没有进一步的关联).

在这种情况下,我遇到了hashCode实现的问题.基本上,MyClassTwo的hashCode实现使用"yetanotherset"属性,并且在确切的行上它访问yetanothertest属性,它失败并带有LazyInitializationException.

org.hibernate.LazyInitializationException: illegal access to loading collection 
Run Code Online (Sandbox Code Playgroud)

我猜,这是因为"yetanotherset"的数据尚未获取,但我该如何解决这个问题呢?我并不特别喜欢将hashCode调低以忽略该属性的想法.

另外一个问题,HQL是否忽略了XML或注释中定义的fetch = FetchType.EAGER,它似乎就是这样.但我无法在任何地方验证这一点.

JB *_*zet 5

hashCode()使用可变字段实现是一个坏主意:它使实体存储在HashSet中并且不可能修改可变属性.

根据其他实体的集合实现它是一个更糟糕的想法:它强制加载集合来计算hashCode.

在实体中选择唯一的,不可变的属性(或属性集),并基于此实现hashCode.最后,您可以选择使用ID,但如果它是自动生成的,则在生成ID之前,不得将其放入Set中.