Lazy加載的方式

關於級聯操作中包含了lazy加載,可以優化加載數據。如果採用EAGER方式加載會耗損很多資源。

 

不過在設置了lazy以後,操作的時候可能會出現Session close的問題。

 

我查閱了很多資料,lazy加載的方式有幾種。

 

不過我覺得最簡單的方式,是加載viewsession。看到別人討論中,說這種方式可能會導致session無法關閉?我也不清楚,等以後再去研究,暫且先用着吧

 

 

Jpa的配置:

 

hibernate的配置:

以上的信息全部要配置與 web.xml

 

在配置web.xml中還要注意順序問題, 應先配置viewsession 然後spring 然後struts

不然也會出現session close的問題。

 

第二種是AOP動態加載的方式見:

http://www.javaeye.com/topic/129698

 

使用動態代理AOP結構,來管理EntityManager,這種方案不依賴於容器,在後臺服務、測試中都可以良好使用。

這種方式也推薦使用..

 

 

 

 

  以上的方案不修改的Service/DAO模型,侵入性小,測試方便,但是有一些侷限性。更良好的方案可以將OpenEntityManagerHandler進行一些修改,
1.    加入private String FACTORY_NAME=DEFAULT_ENTITYMANGER_FACTORY,修改獲取EntityManagerFactory的方法。
2.    在applicationContext-*.xml中配置bean,並ref指向EntityManagerFactory的bean。
3.    修改你的Service/DAO模型,引入OpenEntityManagerHandler。

 

 

 

 

 

 

 

另外還有一種 採用抓取的方式

Hibernate can explicitly initialize the various paths.
For example, let's say we have a PersonDao - we could have this API:

Here is what an implementation of this DAO may look like:

You would use this in your application like this:

This would initialize the mother association, the children association, and each child's mother association (which, would be Jane in this case).

 

在lazy調用的時候,加了以上的openseesionview信息仍然報錯,這個時候就需要檢查配置文件。

1.檢查事務配置

2.檢查Services 事務配置

如果都設定好了,還報錯,這個時候需要修改EntityManager在上下文對應的信息,在@PersistenceContext後面增加(type=PersistenceContextType.EXTENDED),就應該可以解決lazy加載的時候,出現的no session or session was closed的錯誤。 但是需要注意事務處理的時候,會出現其他的問題。

 

Persistence Context 持久化上下文
   
Persistence Context是持久化框架需要維護的一箇中間容器,其中會存放受管理對象的副本,例如從數據庫獲取的實體對象,或者調用持久化框架保存過的對象等
主要作用有:緩存(例如NHibernate的一級緩存概念)、支持Flush操作、輔助實現實體以及屬性的Dirty檢查等
JPA將persistence context分爲2種類型:PersistenceContextType.TRANSACTION和PersistenceContextType.EXTENDED。TRANSACTION類型(默認類型)的persistence context生命週期與transaction scope一致,例如事務開始時爲生命週期的開始階段,事務提交或回滾時生命週期結束。EXTENDED類型的生命週期基本與EntityManager一致,在EntityManager創建時開始,在EntityManager關閉時結束。實現Extended類型的persistence context時需要注意其生命週期可能跨越多個事務以及不在事務範圍內的情況,伴隨的是這些情況下對persistence context中實例對象生命週期以及相關操作的影響,例如version控制等

發佈了130 篇原創文章 · 獲贊 15 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章