2009-04-23 76 views
0

我想在我的持久層管理事務, 但是當我嘗試懶洋洋地獲取結果我得到這個錯誤:冬眠懶動初始化問題

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role

我可以使用LockMode或任何其他方式來解決這個問題? 沒有任何交易可以通過它的id找到一個對象?

回答

2

您的問題是,當您嘗試訪問內容時,Hibernate會話已經關閉。沒有會話,Hibernate無法加載內容。通常有兩種方法可以緩解此問題:

  1. 在完成該頁面之前,請勿關閉會話。這種模式被稱爲「會話中的視圖」,例如可以使用servlet過濾器來實現。

  2. 在關閉會話之前初始化您需要的所有內容。如果你想初始化整個對象,你可以使用Hibernate.initialize(object)。

編輯:你不能在Hibernate的事務之外做任何事情。

+0

謝謝。我知道這個問題很重要,因爲欠薪會議已經結束。您能提供更多關於您提供的第二種解決方案的信息嗎? – user93796 2009-04-23 14:12:55

0

通常,問題在於對象的某個屬性被延遲加載。有一兩件事你可以做的是有它在您的查詢預加載:

距離Sale銷售 其中sale.date>:的startDate LEFT JOIN取sale.product

這將預取的銷售。產品對象。

這個網站有更多的信息:http://www.javalobby.org/articles/hibernate-query-101/

-Dave

0

有許多方法來預取特性,所以它們的存在後,會話關閉:

  1. 只需調用適當的吸氣劑。在將字段提取到bean之後,在會話關閉後它在那裏。
  2. 在使用@OneToMany(fetch = FetchType.EAGER)的JPA中的bean描述符中使用適當的屬性,但有類似的休眠方式。
  3. 您可以初始化HQL查詢中的字段(我不確定它是否適用於HQL,但我認爲它可以),請查找FETCH INTO關鍵字。
0

或者只是使用另一個ORM ......像Ebean ORM其中懶加載只是工作:)