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

我有两个物理服务器,我的Web应用程序由负载均衡器管理。 我总是得到 –

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

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

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

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

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

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

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

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

 session.update(object); 

还要确保您在交易中访问它

在此处阅读有关问题/解决方案的更多信

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

 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.