以下代码触发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)
如何正确查询此关系?
您的代码中有两个问题.
首先,您将一个分离的实体传递给事务服务,并期望该实体自动连接.情况并非如此,分离的实体是分离的,无论您是否在事务内部,尝试从分离的实体加载一些惰性属性都会导致异常.要加载它,您必须通过ID从会话重新加载实体,然后从此附加实体加载延迟集合.
其次,你假设从实体获取集合加载它.事实并非如此.该集合实现为延迟加载的代理,获取集合并返回它只是获取代理(unitilialized)并返回它.只有在调用集合上的方法时,代理才会初始化自身.例如,迭代集合时.这是在交易之外完成的.堆栈跟踪(如果已提供)可能已经确认异常不是从servce内部抛出,而是从服务外部的迭代中抛出.
| 归档时间: |
|
| 查看次数: |
2111 次 |
| 最近记录: |