我将CustomerEntity映射到数据库中的表customers
。它与orders
和addresses
具有一对多的关系。现在我通过下一个代码订购客户:
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
呢?
答案 0 :(得分:1)
当您尝试在session
不可用时访问延迟加载集合或字段时,会发生此异常。我的猜测是 - 应用程序的后端加载数据并关闭会话,然后将这些数据传递给前端,例如,没有会话的地方。
要解决此问题,有几种可能的方法:
session-per-request
。问题Create Hibernate-Session per Request包含的信息可能对您有用。 有关其他会话管理策略的信息,请尝试阅读this wiki page。
答案 1 :(得分:0)
有一些事情可以帮到你:
Hibernate.initialize(customer.getAddresses())