2015-12-07 30 views
0

這已被討論了很多(如herethere)和我使用「企業」鍵實現對Hibernate實體,如哈希碼法時,聽起來很有用:實施的hashCode和延遲加載

public class User { 
    private String username; 
    ... 
    @Override 
    public int hashCode() { 
     //Calculate on base of username 
    } 
} 

這比在休眠生成ID的情況下使用ID更好(對於新實體它將爲空)。

如果一個實體僅包含「虛擬」延遲加載的屬性,該怎麼辦? 我可以計算基於它們的hashCode,並做到目前爲止。現在我遇到了這樣的問題:當調用hashCode()時,會話被關閉,所以懶惰加載的屬性不能再被訪問。在這種情況下該怎麼辦?

回答

1

默認情況下,如果我正在對一個實體進行代碼審查,我會要求程序員使equals()hashcode()不依賴於延遲加載的屬性。感覺像抽象的失敗,有equals()hashcode()方法成功或失敗取決於休眠的會話狀態。畢竟,如果它的商業密鑰不可用,那麼它就不是一個乾淨的對象,只不過主鍵不可用。

我會建議急於提取相關屬性。在一些極少數情況下,您可以使用hibernate批註中的@Formula來獲取必要的字段作爲派生屬性,以計算equalshashcode