0

我這種情況(在底部的細節):緩存懶惰從開放式會話中視加載延遲加載關係的集合

  • X是一個Hibernate實體
  • XY是lazy-加載參考Y,另一休眠實體
  • yz爲休眠實體的延遲加載,緩存收集ž

在交易後的Spring bean,開放式會話中視中,我訪問Xyz並獲得「org.hibernate.Hi bernateException:無法解析爲二級緩存加載集合[...]的所有者「。 調試到休眠4.3.8.Final我發現X.y是使用臨時會話懶惰地加載的,因此在「原始」StatefulPersistenceContext(其中CollectionLoadContext正在查找它)中不可用。

那麼我正在做的事情只是沒有完成?我是否需要事先顯式觸發這個延遲加載或刪除緩存?

public class Teachable { 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "fk_org_element_sch", nullable = false) 
    protected ElementSch element; 
} 

public class ElementSch { 
    @OneToMany(targetEntity = ElementConnectionSch.class) 
    @JoinColumn(name = "fk_org_element_parent") 
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
    private Collection<ElementConnectionSch> childConnections; 
} 

public class ElementConnectionSch { 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name="fk_org_element_parent") 
    private ElementSch parent; 
} 

的transacation一直致力於之後,但仍內開放式會話中視,我打電話Teachable.getElement()。getChildConnections(),並獲得HibernateException的。從調試中我可以看到ElementSch和ElementConnectionSch在單獨的會話中被延遲加載,即主會話已經加載了Teachable,並且ElementSch和ElementConnectionSch使用了兩個單獨的臨時會話。

+0

你也可以上傳你的hbm文件嗎?另外*獲取X.y集合的屬性值? –

回答

0

這已被確定爲我們的部分原因是由於休眠版本升級的問題:

我們使用Spring的Webflow,把休眠實體到流動範圍。爲了在流中的多個調用中正常工作,我們注入了將實體和集合的重新連接包裝器,以便它們可以選擇正在進行的調用的會話,而不是使用它們創建的實例,現在已關閉。

隨着版本升級來改變如何進行這種注射液,雖然工作的時候,前應用原來的映射加載,即我們環繞在空迭代器和注入什麼。