管理Hibernate 會話以避免LazyInitializationException
「org.hibernate.LazyInitializationException:無法初始化代理- 無錯誤階段」 :存取Hibernate 會話範圍之外的延遲初始化實體。本文透過探索解決方案而不更改延遲載入配置來解決此問題。
問題
在提供的程式碼片段中,getModelByModelGroup 方法最初是在沒有正確會話的情況下實現的處理,導致異常。嘗試手動控制會話並開始交易也未能解決該錯誤。
建議的解決方案
要避免此問題,可以考慮各種方法:
使用@Transactional註解包含getModelByModelGroup方法的類別。 Spring會自動管理會話處理,消除手動會話和事務控制的需要。這可以確保該方法在交易內執行,防止延遲初始化異常。
@Transactional public class MyClass { public Model getModelByModelGroup(int modelGroupId) { ... } }
手動建立並關閉 getModelByModelGroup 方法範圍內的 Hibernate 會話。這提供了對會話管理的明確控制,但需要仔細處理以避免資源洩漏。
public Model getModelByModelGroup(int modelGroupId) { Session session = SessionFactoryHelper.getSessionFactory().openSession(); try (session) { // using Java 9+ syntax // perform database operations } catch (Exception ex) { // handle exception } }
考慮重新設計應用程式架構來建立範圍快取或資料存取物件模式來管理Hibernate 會話和延遲初始化的實體。這減少了手動會話處理的需要。
附加註解
以上是如何在不禁用延遲載入的情況下防止 Hibernate 的 LazyInitializationException?的詳細內容。更多資訊請關注PHP中文網其他相關文章!