2012-03-12 109 views
1

我有一个HQL查询的东西阿拉”休眠,取,HQL和hashCode()

SELECT myclass 
FROM 
    MyClass myclass JOIN FETCH 
    myclass.anotherset sub JOIN FETCH 
    sub.yetanotherset 
... 

因此,MyClass类有一个属性‘anotherset’,这是一个包含另一个类的实例一组,让通话它MyClassTwo。而且,MyClassTwo类有一个属性yetanotherset,它是一组第三类(没有进一步关联)。

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

org.hibernate.LazyInitializationException: illegal access to loading collection 

我猜,这是因为“yetanotherset”的数据还没有被提取,但我该如何解决这个问题?我并不特别喜欢使用hashCode忽略该属性的想法。

附加的问题,并忽略HQL取= FetchType.EAGER如XML或注解定义,好像它。但我无法在任何地方验证。

回答

5

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

在其他实体的集合方面实现它是一个更糟糕的想法:它迫使收集的负载来计算哈希码。

选择一个独特的,不可变的属性(或一组性质的)在你的实体,并实现基于该哈希码。在最后的手段中,您可以选择使用该ID,但是如果它是自动生成的,则在生成ID之前不能将其置于Set中。

1

这是hibernate最着名的例外,正如您所描述的那样。会话已断开连接,事务已关闭,并且您正尝试访问此集合。不管注释是否存在,您的HQL中的JOIN FETCH都应强制EAGER加载。

我怀疑你的注释是畸形的,你已经丢失或过期罐,或该类型的其他一些问题。

撞你的Hibernate日志级别高达生成SQL hibernate.SQL=debug,调查正在执行什么SQL,直到您看到这个异常。这应该表明你的hibernate配置是否按照你认为配置的方式运行。

发布更多的代码和日志,有人可能会帮助您发现错误。