我使用ontomany建立好表後,出現這個org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: example.model.MUser.logs, could not initialize proxy - no Session
回覆列表
-
1 # 瘋狂的程式設計師
你這個問題並不是你註解用的不對而是你呼叫獲取結果的時機有問題,你在一個事務裡面查詢出結果後類的logs屬性並沒有真正拿到值,這時候的logs只是一個代理,因為預設情況下onetomany是懶載入的。
而這個時候你查詢但結果後吧事務關閉了以後再去掉getlogs這時候代理需要的sesaion已經沒有了,因此就只能丟擲懶載入異常,意思告訴你這個屬性採用的是懶載入,但是要獲取實際值的時候已經沒有session了,也就是對應的事務關閉了
處理辦法有一下幾種
1、如果是web專案可以新增openSessionInView的過濾器,它可以讓session開啟關閉的時機推遲到頁面處理前後,這樣sessoon就不會因為service處理後自動關閉了,但是改變了預設關閉時機會帶來其他一些隱患不推薦,這裡不展開了
2、配置fetch屬性變成eager,這個要看你的業務適不適合,如果關鍵查詢出大量資料會有效能問題
3、在同一個session內部對需要加載出來的屬性先呼叫get加載出來
4、放棄對映關係,需要時候直接採用傳統sql查詢
大致就是這幾種方式挑一個合適你的去用吧