2012-02-08 71 views
0

我在EJB2.0图层上使用transactions并从那里打电话给DAO层,其中正在对db进行hibernate调用。关于休眠懒惰初始化错误

问题时遇到了现在的问题是,因为我设置lazy="false"即休眠正在对数据库多次调用,现在我试图改变lazy="true"但现在我把我们自己:

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" 

会高度赞赏任何建议,以提高休眠的性能。

回答

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

当您尝试访问对象(代理)的成员,你得到不同的是还没有被初始化,该对象未绑定到一个会话(分离)。在考虑更改批量大小之前,您必须先解决该问题。

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

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

看看here

我希望我能帮到:)

+0

更新了有关如何调用交易的详细信息。 – Rachel 2012-02-08 18:40:15

1

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

+0

这里的问题是,我正在使用ejb事务并从ejb调用dao,因此会话的维护由ejb事务处理,并且存在多个正在运行的嵌套查询,因此不确定引发惰性异常的确切位置。 – Rachel 2012-02-08 19:06:01