避免Hibernate的策略LazyInitializationExceptions

避免Hibernate的策略LazyInitializationExceptions

问题描述:

除了使用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

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

这可以(至少)三种方式实现:使用急切策略(即FetchMode.JOIN,如果您使用的是Criteria API

  • 明确初始化属性(即Hibernate.initialize(property)

    1. fetching性质)
    2. 通过调用适当的属性访问隐含初始化特性

    关于OpenSessionInView的缺点,您是否检出了this页?

  • 通常是处理问题的最佳方式,而不需要做出全局决策来执行提前取回;与hql查询结合使用“fetch”关键字。

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

    此外,“取”加入允许使用单一选择与父母一起的对象初始化值的协会或收藏。这在收集的情况下特别有用。它有效地覆盖了关联和集合映射文件的外连接和惰性声明。有关更多信息,请参见第19.1节“获取策略”。

    从猫的猫 内连接抓取cat.mate 左加入取cat.kittens

    切换到JBoss Seam的。

    Seam框架由开发Hibernate的人构建。

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

    Hibernate已经智能地提取数据,改变提取模式会导致性能下降。不仅如此,而且你正在摆脱约定,并会用无关的配置细节来弥补你的项目。

    沃尔特

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