2008-10-18 119 views
7

除了使用OpenSessionInView模式之外,還有其他方法可以避免Hibernate Web應用程序中的LazyInitializationExceptions嗎?使用OpenSessionInView有什麼缺點嗎?避免Hibernate的策略LazyInitializationExceptions

+0

Hibernate 4.1.6解決了這個問題:http://stackoverflow.com/questions/578433/how-to-solve-lazy-initialization-exception-using-jpa-and-hibernate-as-provider/11913404#11913404 – andreak 2012-08-11 09:14:38

回答

8

在處理我們的Web應用程序時,我們通常會事先決定在視圖頁面中需要哪些對象/字段,並確保在調度到視圖之前,所有對象都從模型中正確初始化。

這可以(至少)三種方式實現:使用急切策略(即FetchMode.JOIN,如果您使用的是Criteria API

  • 明確初始化屬性(即Hibernate.initialize(property)

    1. fetching性質)
    2. 通過調用適當的屬性訪問隱含初始化特性

    關於OpenSessionInView的缺點,您是否檢出了this頁?

  • 5

    通常是處理問題的最佳方式,而不需要做出全局決策來執行提前取回;與hql查詢結合使用「fetch」關鍵字。

    http://www.hibernate.org/hib_docs/reference/en/html/queryhql-joins.html

    此外,「取」加入允許使用單一選擇與父母一起的對象初始化值的協會或收藏。這在收集的情況下特別有用。它有效地覆蓋了關聯和集合映射文件的外連接和惰性聲明。有關更多信息,請參見第19.1節「獲取策略」。

    從貓的貓 內連接抓取cat.mate 左加入取cat.kittens

    1

    切換到JBoss Seam的。

    Seam框架由開發Hibernate的人構建。

    即使在視圖中打開會話,您仍然可能會遇到一些問題。根據您的Web應用程序的複雜程度,Open View In View不處理所有情況。在石英工作期間,例如發送電子郵件,我也遇到了顯示數據(在用戶界面中)與獲取實體有關的問題。

    Hibernate已經智能地提取數據,改變提取模式會導致性能下降。不僅如此,而且你正在擺脫約定,並會用無關的配置細節來彌補你的項目。

    沃爾特

    0

    甲骨文的Java教程指出,「企業Bean支持事務,用於管理共享對象的併發訪問的機制。」所以,爲了處理Lazy Fetch問題,我創建了一個無狀態Java會話Bean,然後在從該方法返回之前獲取所需的所有子類。 Oracle也將其稱爲「會話外觀」核心J2EE模式。這些實踐似乎比其他提及的其他應用程序更好。

    相關問題