关于Hibernate LazyInitialization错误

时间:2012-02-08 16:32:28

标签: java performance hibernate orm

我在transactions图层上使用EJB2.0,并从那里调用DAO图层,其中正在对db进行hibernate调用。

我现在面临的问题是,hibernate正在多次调用数据库,因为我设置了lazy="false",现在我尝试更改lazy="true",但现在我正在使用自己的:{/ p>

  

org.hibernate.LazyInitializationException:无法初始化代理    - 拥有的会议已经结束

错误消息。

我对SO做了一些研究,发现解决方案可能是

 <prop key="hibernate.default_batch_fetch_size">30</prop>
 <prop key="hibernate.jdbc.fetch_size"></prop>

我的问题是fetch_size的默认大小是什么,如果这是解决此问题的正确方法。

我想要做的就是确保应用程序不会多次调用数据库来运行所有这些N查询,因为现在在页面之间导航很麻烦并且使应用程序非常慢,因为每次点击都会,有N个查询在后台运行,增加了应用程序加载时间。

更新

以下是设置交易的方式:

 * @hibernate.class table="SCHEDULE_ENTRY" discriminator-value="task" lazy="true"
 * @hibernate.discriminator column="KIND" length="4"

非常感谢任何提高hibernate性能的建议。

2 个答案:

答案 0 :(得分:1)

在关闭会话之前访问对象的成员。这是主要问题。

答案 1 :(得分:0)

org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed

当您尝试访问尚未初始化的对象(代理)的成员并且该对象未绑定到会话(已分离)时,您会收到该异常。在考虑更改批量大小之前,您必须首先解决该问题。

要解决该问题,请确保初始化您要访问的所有属性。 这取决于您可以使用延迟加载的事务/会话配置。如果您发布交易/会话配置会很有帮助。

您可以使用Hibernate.initialize()初始化成员,但我建议您仅在需要时更改提取策略。

看看here

我希望我能提供帮助:)。