2010-07-24 93 views
0

當試圖從數據庫項目,我得到這個錯誤:Hibernate的JPA,Spring MVC和LazyInitializationException中

13:00:13.876 [[email protected]] ERROR o.h.LazyInitializationException - failed to lazily initialize a collection of role: bo.myobj, no session or session was closed 
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: de.myob.linkedstuff, no session or session was closed 

我瞭解,切換到渴望,而不是延遲加載解決了這個問題,例如

@OneToMany(mappedBy = "myobj", cascade = CascadeType.ALL, fetch=FetchType.EAGER) 

我也明白,急切的加載是不鼓勵的。爲了解決這個問題,最好的做法是什麼?

回答

2

更好的持久性和其它層之間的分離。確保持久層生成的對象不包含對Hibernate的任何引用。

該文章Hibernate, Get Out of My POJO!可能會有所幫助。

+0

感謝提示,我想這是正確的策略。但是,自從我開始使用ORM後,我遇到了很多問題,我想知道是否有是任何使用* any * ORM的好處...對不起,只是*有*提到:-( – 2010-07-24 16:26:33

+0

@erlord:隨意不使用ORM(至少沒有定義的持久化上下文)然後:)運氣! – 2010-07-24 17:31:17

5

我很確定這發生在沒有活動事務時。

閱讀Declarative Transaction Management

通常把它歸結爲您服務方法或類需要的@Transactional註釋,如果你使用註釋或<tx:advice>否則正確的XML配置Spring參考部分。

+0

對不起,我檢查了所有的豆 - @Transactional存在於所有的DAO方法中...我的xml看起來也很好 – 2010-07-24 12:51:55

+0

感謝downvoting。我的意思是:當你訪問集合時,你還在事務範圍內嗎?因爲這可能不是在dao方法中發生的,是嗎? – 2010-07-25 06:14:50

+1

這不應該得到一個downvote國際海事組織。 +1來抵消。 – 2010-07-25 19:25:18

3

這是一個常見問題,通常是由休眠Session關閉後渲染視圖引起的。一個常見的解決方案是使用Open Session In View模式,這將保持休眠會話在Web請求的生命週期中保持打開狀態。

Spring自帶一個filter實現此模式。要啓用它在你的應用程序的所有JSP文件,例如,添加這樣的事情你web.xml

<filter> 
    <filter-name>osivFilter</filter-name> 
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>osivFilter</filter-name> 
    <url-pattern>*.jsp</url-pattern> 
</filter-mapping> 
+0

我插入了行,但是,laziiniterror持續存在:-( – 2010-07-24 14:12:15