【问题标题】:Strategies to avoid Hibernate LazyInitializationExceptions避免 Hibernate LazyInitializationExceptions 的策略
【发布时间】:2008-10-18 23:52:30
【问题描述】:

除了使用 OpenSessionInView 模式之外,还有其他方法可以避免 Hibernate Web 应用程序中的 LazyInitializationExceptions 吗?使用 OpenSessionInView 有什么缺点吗?

【问题讨论】:

标签: java database hibernate


【解决方案1】:

在处理我们的 Web 应用程序时,我们通常会事先决定视图页面中需要哪些对象/字段,并确保所有对象在分派到视图之前从模型中正确初始化。

这可以通过(至少)三种方式实现:

  1. fetching 属性使用 Eager 策略(即使用 FetchMode.JOIN,如果您使用的是 Criteria API
  2. 显式初始化属性(即使用Hibernate.initialize(property)
  3. 通过调用适当的属性访问器来隐式初始化属性

关于 OpenSessionInView 的缺点,你查看过this 页面吗?

【讨论】:

    【解决方案2】:

    通常是处理问题的最佳方式,无需做出全局决定来进行急切获取;就是结合hql查询使用“fetch”关键字。

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

    此外,“获取”连接允许使用单个选择来初始化值的关联或集合及其父对象。这在集合的情况下特别有用。它有效地覆盖了关联和集合的映射文件的外部连接和惰性声明。有关详细信息,请参阅第 19.1 节,“获取策略”。

    从猫当猫 内连接获取 cat.mate left join fetch cat.kittens

    【讨论】:

      【解决方案3】:

      切换到 JBoss Seam。

      Seam 框架由 Hibernate 开发人员精心设计。

      即使在 View 中打开会话,您仍可能遇到一些问题。根据您的 Web 应用程序的复杂程度,Open Session In View 不会处理所有情况。在石英作业(例如发送电子邮件)期间,我在显示数据以及(在 UI 中)获取实体时遇到了问题。

      Hibernate 已经智能地获取数据,更改获取模式会导致性能下降。不仅如此,您还偏离了惯例,并且会用无关的配置细节搞砸您的项目。

      沃尔特

      【讨论】:

        【解决方案4】:

        Oracle Java 教程指出“企业 bean 支持事务,即管理共享对象并发访问的机制”。因此,为了处理 Lazy Fetch 问题,我创建了一个无状态 Java 会话 Bean,然后在从该方法返回之前获取我需要的所有子类。 Oracle 也将此称为“会话外观”核心 J2EE 模式。这些实践似乎比提到的其他一些实践要好得多。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-20
          • 1970-01-01
          • 1970-01-01
          • 2011-08-18
          • 2011-02-23
          • 2011-08-14
          • 2014-03-24
          • 2011-09-11
          相关资源
          最近更新 更多