【发布时间】:2016-07-13 02:29:38
【问题描述】:
我面临以下交易错误:
org.hibernate.LazyInitializationException: 延迟初始化失败 角色集合: app.Parent.children,可以 不初始化代理 - 没有会话
这里是parent.getChildren().size()。
但我在@Service 方法上有一个@Transactional:
-
createFactory()上的 1 笔交易用于创建工厂并提供给实体管理器 -
create()上的 1 笔交易用于创建实体
@Path("api/parents")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Controller
public class ParentResource {
@Autowired
private ParentService parentService;
@POST
public Parent create(Parent parent) {
ParentFactory parentFactory = parentService.createFactory(parent);
return parentService.create(parent);
}
}
@Service
public class ParentService {
@PersistenceContext
private EntityManager em;
@Transactional
public ParentFactory createFactory(Parent parent) {
return new ParentFactory(parent, em);
}
@Transactional
public Parent create(ParentFactory parentFactory) {
return parentFactory.create();
}
}
// No Transactional annotation
public class ParentFactory {
private Parent parent;
private EntityManager em;
public ParentFactory(Parent parent, EntityManager em) {
this.parent = parent;
this.em = em;
}
public parent create() {
if(parent.getChildren().size() < 3) { // Exception here
em.persist(this.parent);
}
}
}
我希望能够测试我的 Hibernate Session 何时处于活动状态,以便我可以检查它何时丢失以及丢失的原因。
谢谢!
【问题讨论】:
-
同时检查会话是否存在也无济于事。您需要弄清楚为什么会出现异常。
-
事务方法完成后会话立即关闭。您有 2 个事务方法,每个都打开一个新的会话/实体管理器。最初用于
Parent的会话已经关闭,因此出现错误。将该逻辑推送到单个事务服务方法中(恕我直言),而不是在您的控制器中。 -
谢谢,但是我的问题更多是关于如何检查会话的状态,而不是为什么这个例子实际上失败了。我已经解决了这个问题,但是如果我的休眠会话是打开或关闭的,我想要一种简单的方法来记录:)
标签: java spring hibernate session transactional