如何解决Hibernate LazyInitializationException

时间:2014-04-24 09:16:05

标签: java hibernate

我将CustomerEntity映射到数据库中的表customers。它与ordersaddresses具有一对多的关系。现在我通过下一个代码订购客户:

DetachedCriteria criteria = DetachedCriteria.forClass(CustomerEntity.class);
criteria.add(Restrictions.eq("id", patientId));
criteria.createCriteria("orders", CriteriaSpecification.LEFT_JOIN).add(Restrictions.and(
          Restrictions.isNull("deletedDate"),
          Restrictions.or(Restrictions.isNull("old"), Restrictions.eq("old", BoolType.FALSE))));
CustomerEntity customer = queryDao.searchSingle(criteria);

QueryDAO:

public <T> T searchSingle(DetachedCriteria criteria) {
   return (T) criteria.getExecutableCriteria(getCurrentSession()).uniqueResult();
}

但是当我尝试调用customer.getAddresses()时,会抛出下一个异常:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: , no session or session was closed

这是因为默认情况下hibernate没有加载一对多实体。 如果不修改Customer实体,我怎能撤回他的addresses呢?

2 个答案:

答案 0 :(得分:1)

当您尝试在session不可用时访问延迟加载集合或字段时,会发生此异常。我的猜测是 - 应用程序的后端加载数据并关闭会话,然后将这些数据传递给前端,例如,没有会话的地方。

要解决此问题,有几种可能的方法:

  • 急切加载。可靠但可能很慢的解决方案;
  • 更改会话管理的方式。考虑适用于典型Web应用程序的策略session-per-request。问题Create Hibernate-Session per Request包含的信息可能对您有用。

有关其他会话管理策略的信息,请尝试阅读this wiki page

答案 1 :(得分:0)

有一些事情可以帮到你:

  • 使用Hibernate.initialize(customer.getAddresses())
  • 您没有显示使用customer.getAddresses()的位置......所以另一种方法是在View中使用Hibernate Open Session(以及上一个答案中提到的其他会话管理策略。