public class Aaa{
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "bbb")
private BBB bbb;
}
public class BBB{
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ccc")
private CCC ccc;
}
public class CCC{
//other fields
@Column(name = "zzz")
private String zzz;
}
使用HQL查询FROM AAA a JOIN FETCH a.bbb b JOIN FETCH b.ccc
。
但是,当我这样做时,c.getZzz();
得到了例外
org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话
如何在不设置的情况下修复此问题EAGER
?
发布于 2019-03-20 10:11:01
看起来您的实体正在与会话分离,并且Hibernate仅通过会话访问数据库,因此如果实体与会话分离并且您尝试访问尚未加载的关联(通过代理或集合包装器) ,Hibernate throws a LazyInitializationException
。
请插入调用以检查会话附件,否则请附加到会话中。
if (session.contains(c))
{
//value exists, access it
c.getZzz()
}
else
{
session.merge(c);
}
来自hibernate javadoc的参考
通过调用save(),persist()或saveOrUpdate()可以使瞬态实例持久化。通过调用delete()可以使持久化实例成为瞬态。get()或load()方法返回的任何实例都是持久的。可以通过调用update(),saveOrUpdate(),lock()或replicate()使分离的实例持久化。通过调用merge(),瞬态或分离实例的状态也可以作为新的持久实例持久化。
要强制会话持续直到加载所有数据,请使用事务。确保所有get调用都在事务下执行。
如果使用spring,annotate方法使用@Transactional
和使用@EnableTransactionManagement
配置类或<tx:annotation-driven/>
使用spring xml。并确保您的bean在春季环境中管理,否则@Transactional
将无效。
检查这个的简单方法是TransactionSynchronizationManager.isActualTransactionActive()
在您的访问方法中打印,true
否则输出应该找出您的spring bean的配置错误。
https://stackoverflow.com/questions/-100006468
复制相似问题