Java 如何解决Hibernate';s LazyInitializationException
我将CustomerEntity映射到数据库中的表Java 如何解决Hibernate';s LazyInitializationException,java,hibernate,Java,Hibernate,我将CustomerEntity映射到数据库中的表customers。它与订单和地址有一对多关系。现在,我用下一个代码检索客户订单: DetachedCriteria criteria = DetachedCriteria.forClass(CustomerEntity.class); criteria.add(Restrictions.eq("id", patientId)); criteria.createCriteria("orders", CriteriaSpecification.LE
customers
。它与订单
和地址
有一对多关系。现在,我用下一个代码检索客户订单:
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);
克雷道:
public <T> T searchSingle(DetachedCriteria criteria) {
return (T) criteria.getExecutableCriteria(getCurrentSession()).uniqueResult();
}
这是因为默认情况下hibernate没有加载一对多实体。
如何在不修改
客户
实体的情况下也检索其地址
呢?如果在会话
不可用的情况下尝试访问延迟加载集合或字段,则会发生此异常。我的猜测是-应用程序的后端加载数据并关闭会话,然后将这些数据传递到前端,例如,在没有会话的情况下
要解决这个问题,有几种可能的方法:
- 急切的装载。可靠但可能缓慢的解决方案李>
- 更改会话管理的方式。考虑策略>代码>每次请求会话/>代码>,适用于典型的Web应用程序。该问题包含可能对您有用的信息李>
有关其他会话管理策略的信息,请尝试阅读。以下几点可以帮助您:
- 使用
Hibernate.initialize(customer.getAddresses())
- 您没有显示customer.getAddresses()的使用位置。。。因此,另一种方法是在视图中使用Hibernate Open Session(以及前面答案中提到的其他会话管理策略)
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: , no session or session was closed