示例代码:
protected Session session() {
return (Session) getEntityManager().getDelegate();
}
session().createCriteria( entityClass )
首次调用session()。createCriteria()会在没有可用事务的情况下抱怨会话已关闭。
所以我使用:
创建一个只读事务TransactionTemplate template = new TransactionTemplate( getTransactionManager() )
template.setPropagationBehavior(TransactionDefinition.PROPAGATION_SUPPORTS);
template.setReadOnly(true);
TransactionStatus status = getTransactionManager().getTransaction(template);
我是否需要提交此交易: 。的getTransactionManager()提交(状态);
问题是,如果这已经提交,我稍后将需要另一个事务:
criteria.list();
并且问题在于,第二次,它是与用于获取会话的事务不同的事务,并且导致错误。它会抱怨它已经关闭了。
session()。createCriteria和criteria.list必须在它看来的同一个事务中使用。但是我的代码在方法中有这些,因此没有很好的方法来确保这些方法单独工作,除非session.createCriteria事务仍未提交。
我可以安全地保留TransactionDefinition.PROPAGATION_SUPPORTS事务未提交吗?我可以创建多少个此类交易?
答案 0 :(得分:3)
不,你不能把它当作未经注册的。只读更多是对底层事务管理器的暗示,以禁止当前事务上下文中的突变。如果您以后需要访问同一个事务,也许您需要稍微改变一下设计。为什么不在方法的调用者中打开事务并在那里处理它?或者尝试基于声明或注释的方法?