2012-10-13 69 views
3

任何人都可以幫助我處理@Any關係嗎?由於LazyInitializationException無法獲取@Any相關實體

我有一個接口InteractionParticipate這是誰想要參與某種消息交互的一部分誰實現。消息由具有發射機和接收機的InteractionMessage表示。由於我們不知道哪個實體實現InteractionParticipate將成爲消息的接收者(或發送者),我們必須使用@Any關係。

我已閱讀this one這啓發了我和InteractionMessage類似的東西寫道:

@Any(metaColumn = @Column(name = "Transmitter_Type")) 
@AnyMetaDef(
     idType = "long", 
     metaType = "string", 
     metaValues = { 
       @MetaValue(value = "Applicant", targetEntity = Applicant.class), 
       @MetaValue(value = "Vacancy", targetEntity = Vacancy.class) 
     }) 
@JoinColumn(name = "Transmitter_Id") 
@LazyToOne(LazyToOneOption.FALSE) 
private InteractionParticipate transmitter; 

@Any(metaColumn = @Column(name = "Receiver_Type")) 
@AnyMetaDef(idType = "long", metaType = "string", 
     metaValues = { 
       @MetaValue(targetEntity = Applicant.class, value = "Applicant"), 
       @MetaValue(targetEntity = Vacancy.class, value = "Vacancy") 
     }) 
@JoinColumn(name = "Receiver_Id") 
@LazyToOne(LazyToOneOption.FALSE) 
private InteractionParticipate receiver; 

數據庫中創建好,我可以看到實體保存正確。但是,當我嘗試從數據庫

InteractionMessage message = (InteractionMessage) session.get(InteractionMessage.class, id);

得到一個InteractionMessage我的臉,我不能得到既不receiver也不transmitter因爲方法拋出「org.hibernate.LazyInitializationException」例外。無法評估...空缺_ $$ _ javassist_49.toString()。 (空缺職位正在實施InteractionParticipate。)

我試圖玩@LazyToOne甚至@LazyCollection但失敗。

請幫我弄明白。提前致謝!

回答

0

您正嘗試訪問分離對象的集合。 分離對象表示它未連接到會話。因此,訪問懶惰集合時,您會收到異常。 這可能會發生不同的原因。例如,您從前端通過序列化接收對象。 有兩種可能的解決方案,取決於需要的結果。

1)您可以定義要急切提取的集合。這意味着一旦父對象被初始化,集合就被初始化。 2)你可以合併對象(T mergedObject em.merge(detachedObject);)來訪問它的集合。

一個小警告:em.merge()返回一個合併的對象。但是,舊的仍然是分離的,所以請記住要訪問合併的那個。

相關問題