org.hibernate.LazyInitializationException :懒得初始化角色集合:com.t4bt.gov.persistence.entities.Experts.institutaionList,没有关闭会话或会话
答案 0 :(得分:3)
您在问题中提供的细节很少(代码?),因此它必须是关于延迟加载的一般化答案。将来,如果您需要答案,请提供有关实际问题的具体信息,以及您试图解决的问题的描述。
当您在会话关闭后尝试访问延迟加载的属性时(通常在事务结束后),会发生LazyInitialization。懒惰初始化的工作方式是,它在获取对象时不会获取延迟初始化的属性,但是当您实际尝试访问它时,Hibernate会对数据库执行另一个查询以获取它。
以下会产生这样的错误:
public class Something {
[...]
@OneToMany(fetch = FetchType.LAZY)
private List<SomethingElse> somethingElse;
public List<SomethingElse> getSomethingElse() {
return somethingElse;
}
}
public class SomethingDao {
@Inject
private EntityManager em;
@Transactional
public Something getById(final Integer id) {
return em.find(Something.class, id);
}
}
public class SomethingService {
@Inject
private SomethingDao dao;
public List<SomethingElse> getSomethingElseForSomething(final Integer somethingId) {
final Something something = dao.getById(somethingId);
return something.getSomethingElse() //Throws LazyInitializationException
}
}
此处事务(以及会话)仅存在于dao类中。离开dao-method后,会话就消失了。因此,当您尝试访问服务中的延迟加载属性时,当Hibernates尝试联系会话以检索它时,它将失败。
为避免这种情况,有几种可能性。
@OneToMany(fetch = FetchType.EAGER)
该属性不再是懒惰的,所以不再有问题。@Transactional
添加到Service-method。然后对getSomethingElse()
的调用将与获取Something-object的事务处于同一事务中,并且在执行此操作时会话仍将处于活动状态。 getSomethingElse()
的调用。然后它将在离开Dao类(和事务)之前初始化属性(从数据库中获取),并且它将在事务外部可用,而不需要与会话通信以便检索它。