2012-03-12 72 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配置是否按照你認爲配置的方式運行。

發佈更多的代碼和日誌,有人可能會幫助您發現錯誤。