【发布时间】:2008-10-18 23:52:30
【问题描述】:
除了使用 OpenSessionInView 模式之外,还有其他方法可以避免 Hibernate Web 应用程序中的 LazyInitializationExceptions 吗?使用 OpenSessionInView 有什么缺点吗?
【问题讨论】:
-
Hibernate 4.1.6 解决了这个问题:stackoverflow.com/questions/578433/…
除了使用 OpenSessionInView 模式之外,还有其他方法可以避免 Hibernate Web 应用程序中的 LazyInitializationExceptions 吗?使用 OpenSessionInView 有什么缺点吗?
【问题讨论】:
在处理我们的 Web 应用程序时,我们通常会事先决定视图页面中需要哪些对象/字段,并确保所有对象在分派到视图之前从模型中正确初始化。
这可以通过(至少)三种方式实现:
FetchMode.JOIN,如果您使用的是 Criteria API)Hibernate.initialize(property))关于 OpenSessionInView 的缺点,你查看过this 页面吗?
【讨论】:
通常是处理问题的最佳方式,无需做出全局决定来进行急切获取;就是结合hql查询使用“fetch”关键字。
来自http://www.hibernate.org/hib_docs/reference/en/html/queryhql-joins.html
此外,“获取”连接允许使用单个选择来初始化值的关联或集合及其父对象。这在集合的情况下特别有用。它有效地覆盖了关联和集合的映射文件的外部连接和惰性声明。有关详细信息,请参阅第 19.1 节,“获取策略”。
从猫当猫 内连接获取 cat.mate left join fetch cat.kittens
【讨论】:
切换到 JBoss Seam。
Seam 框架由 Hibernate 开发人员精心设计。
即使在 View 中打开会话,您仍可能遇到一些问题。根据您的 Web 应用程序的复杂程度,Open Session In View 不会处理所有情况。在石英作业(例如发送电子邮件)期间,我在显示数据以及(在 UI 中)获取实体时遇到了问题。
Hibernate 已经智能地获取数据,更改获取模式会导致性能下降。不仅如此,您还偏离了惯例,并且会用无关的配置细节搞砸您的项目。
沃尔特
【讨论】:
Oracle Java 教程指出“企业 bean 支持事务,即管理共享对象并发访问的机制”。因此,为了处理 Lazy Fetch 问题,我创建了一个无状态 Java 会话 Bean,然后在从该方法返回之前获取我需要的所有子类。 Oracle 也将此称为“会话外观”核心 J2EE 模式。这些实践似乎比提到的其他一些实践要好得多。
【讨论】: