Spring 在事务内部时未能延迟初始化集合

Spring 在事务内部时未能延迟初始化集合,spring,hibernate,Spring,Hibernate,以下代码在线程“main”org.hibernate.LazyInitializationException中触发异常:未能延迟初始化角色集合:com.model.entity.WorkflowProcessEntity.workstations,未关闭任何会话或会话错误。因此,我在服务类中用@Transactional包装了该方法,但它仍然抛出错误 WorkstationService workstationService = (WorkstationService) Applicat

以下代码在线程“main”org.hibernate.LazyInitializationException中触发
异常:未能延迟初始化角色集合:com.model.entity.WorkflowProcessEntity.workstations,未关闭任何会话或会话
错误。因此,我在服务类中用
@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();
}
@OneToMany(mappedBy = "workflowProcess")
@JsonIgnore
public Collection<WorkstationEntity> getWorkstations() {
    return workstations;
}
@Transactional(readOnly=true)
公共集合getWorkstations(WorkflowProcessEntity WorkflowProcessEntity){
返回workflowProcessEntity.getWorkstations();
}
WorkflowProcessEntity.java

@Transactional(readOnly = true)
public Collection<WorkstationEntity> getWorkstations(WorkflowProcessEntity workflowProcessEntity) {
    return workflowProcessEntity.getWorkstations();
}
@OneToMany(mappedBy = "workflowProcess")
@JsonIgnore
public Collection<WorkstationEntity> getWorkstations() {
    return workstations;
}
@OneToMany(mappedBy=“workflowProcess”)
@杰索尼奥雷
公共收集站(){
返回工作站;
}

如何正确查询此关系?

您的代码中有两个问题

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


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

发布异常的完整堆栈跟踪和相关代码。相关代码在上面。。。它正在尝试加载getWorkstations()关系。堆栈跟踪是?请详细说明是什么导致实体被删除?一旦加载实体的会话关闭(在典型的Spring应用程序中,这是在事务结束时发生的,除非您在视图中有一个打开的sesion筛选器),实体变得独立。感谢您的反馈。。。关于堆栈跟踪,你是对的。虽然我不清楚如何构造代码来解决这个问题。在Spring/Java应用程序中,当需要查询实体的关系时,重新提取实体是常见的吗?这种情况会发生,但取决于用例,最好从一开始就加载实体,或者在视图过滤器中打开会话。你似乎也在使用Spring,但没有使用依赖注入,这是一种气味。