【问题标题】:How to solve Hibernate's LazyInitializationException如何解决 Hibernate 的 LazyInitializationException
【发布时间】:2014-04-24 09:16:05
【问题描述】:

我已将 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);

查询DAO:

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

这是因为默认情况下休眠没有加载一对多实体。 我如何在不修改Customer 实体的情况下也检索他的addresses

【问题讨论】:

  • 我不得不在这里摇一摇手指:如果你用谷歌搜索过“hibernatelazyinitializationexception”,你会得到大量关于如何解决、为什么以及如何解决的信息,包括大量现有的 stackoverflow 线程。

标签: java hibernate


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    有几件事可以帮助您:

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

    【讨论】:

      猜你喜欢
      • 2010-10-09
      • 2014-12-17
      • 2012-09-28
      • 1970-01-01
      • 2019-09-30
      • 2015-12-02
      • 1970-01-01
      • 2017-02-23
      相关资源
      最近更新 更多