我正在使用Spring/JPA2/hibernate编写以下代码:
class A {
@Autowired
B b;
@RequestMapping("/test")
public void test(final HttpServletRequest r1, HttpServletResponse r2) throws ... {
b.inner(); // Works
b.outer(); // javax.persistence.TransactionRequiredException:
// no transaction is in progress ... :|
}
@Component
class B {
@PersistenceContext
EntityManager em;
public void outer() { inner(); }
@Transactional
public void inner() { em.flush(); }
}
为什么直接调用
inner()
会导致事务丢失?
B.outer()
中的逻辑需要在B.inner()
之前发生,但不涉及事务/持久性,则它可能不属于您的持久性层类(DAL/DAO 等)。考虑重构设计以分离关注点,可能通过使用中间对象来实现。Object intermediate = b.outer(); b.inner(intermediate);
。然后进行重构,使其不再是持久性层类的成员。Object intermediate = someOtherUtilityOrSupportClassInstance.outer(); b.inner(intermediate);
。 - Dan