我在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性能的建议。
答案 0 :(得分:1)
在关闭会话之前访问对象的成员。这是主要问题。
答案 1 :(得分:0)
org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
当您尝试访问尚未初始化的对象(代理)的成员并且该对象未绑定到会话(已分离)时,您会收到该异常。在考虑更改批量大小之前,您必须首先解决该问题。
要解决该问题,请确保初始化您要访问的所有属性。 这取决于您可以使用延迟加载的事务/会话配置。如果您发布交易/会话配置会很有帮助。
您可以使用Hibernate.initialize()
初始化成员,但我建议您仅在需要时更改提取策略。
看看here。
我希望我能提供帮助:)。