org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话

时间:2011-10-04 22:38:38

标签: java hibernate spring exception lazy-loading

我有两台物理服务器,我的网络应用程序由负载均衡器管理。我总是得到 -

org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话

当其中一台服务器被击中而另一台服务器顺利运行时没有任何问题。我有一个由应用程序启用和管理的本地托管缓存存储。只有在尝试从一个表访问一个特定列时才会发生此异常。无论哪个服务器被命中,其余的操作都可以正常工作。

使lazy = false将成为性能问题,因为该表上的行数非常大。顺便说一句,我们在会话中使用get(object)而不是load(object)。

4 个答案:

答案 0 :(得分:13)

从您提供的标签中,我推断您使用Spring Framework遇到了这个问题。我在使用Spring Data LazyInitializationException时遇到了同样的org.springframework.data.jpa.repository.JpaRepository

我通过注释间接使用Hibernate从@Transactional数据库中检索数据的方法解决了这个问题。

答案 1 :(得分:10)

听起来您尝试访问的列被配置为实体中的某种关联(OneToMany,ManyToOne,等等),并且您没有在DAO中填充该关联。然后,当您尝试访问该列时(在代码中没有Hibernate会话的位置),它没有填充,Hibernate会尝试加载它,然后繁荣。

由于您实际上正在使用该关联中的数据,因此使EAGER听起来像您实际想要做的事情。如果该表太大,您应该查看索引,以便对它进行查询是有效的。

答案 2 :(得分:5)

您的对象已分离。在访问它之前,您需要将其重新附加到当前会话:

session.update(object);

还要确保您在交易中访问

详细了解问题/解决方案here

答案 3 :(得分:0)

这是一个关联或属性 - 如果它是一个属性,那么问题可能是其中一个服务器正在运行一个非检测版本。

Lazy attribute fetching: an attribute or single valued association is fetched when the instance variable is accessed. This approach requires buildtime bytecode instrumentation and is rarely necessary.