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

Web*_*net 2 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));
    }
Run Code Online (Sandbox Code Playgroud)

WorkstationService.java

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

WorkflowProcessEntity.java

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

如何正确查询此关系?

JB *_*zet 7

您的代码中有两个问题.

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

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