在事务内部未能懒惰地初始化集合

时间:2013-07-15 19:50:21

标签: spring hibernate

以下代码触发Exception in thread "main" org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.model.entity.WorkflowProcessEntity.workstations, no session or session was closed错误。所以我在服务类中用@Transactional包装了方法,它仍然会抛出错误。

    WorkstationService workstationService = (WorkstationService) ApplicationContextProvider.getApplicationContext().getBean("workstationService");
    for (WorkstationEntity workstationEntity : workstationService.getWorkstations(getEntity())) {
        registerWorkstation(new ImpositionWorkstation(workstationEntity));
    }

WorkstationService.java

@Transactional(readOnly = true)
public Collection<WorkstationEntity> getWorkstations(WorkflowProcessEntity workflowProcessEntity) {
    return workflowProcessEntity.getWorkstations();
}

WorkflowProcessEntity.java

@OneToMany(mappedBy = "workflowProcess")
@JsonIgnore
public Collection<WorkstationEntity> getWorkstations() {
    return workstations;
}

如何正确查询此关系?

1 个答案:

答案 0 :(得分:7)

您的代码中存在两个问题。

首先,您将一个分离的实体传递给事务服务,并期望该实体自动连接。情况并非如此,分离的实体是分离的,无论您是否在事务内部,尝试从分离的实体加载一些惰性属性都会导致异常。要加载它,您必须通过ID从会话重新加载实体,然后从此附加实体加载延迟集合。

其次,你假设从实体获取集合加载它。事实并非如此。该集合实现为延迟加载的代理,获取集合并返回它只是获取代理(unitilialized)并返回它。只有在调用集合上的方法时,代理才会初始化自身。例如,迭代集合时。这是在交易之外完成的。堆栈跟踪(如果已提供)可能已经确认异常不是从servce内部抛出,而是从服务外部的迭代中抛出。