我使用Spring/JPA2 /這段代碼冬眠:間接的Hibernate/JPA的方法調用失去交易
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()
只有當間接地稱爲鬆散的交易?
我的目標是創建一個後臺程序並每次提交一些小的位。所以註釋outer()作爲單數事務不是我的意圖。我正在將代理模式更改爲aspect-j模式。 謝謝! – Cojones
如果'B.outer()'中的邏輯需要在'B.inner()'之前發生,但不涉及事務/持久性,它可能不屬於你的持久層類(DAL/DAO等)。考慮重構你的設計來分離問題,可能通過使用中間對象。 'Object intermediate = b.outer(); b.inner(中間);'。然後重構,以便它不再是持久層類的成員。 'Object intermediate = someOtherUtilityOrSupportClassInstance.outer(); b.inner(中間);'。 – Dan
現在我已經切換到LTW了,但我現在在任何調用中都沒有交易:(所有配置都添加了 ,
Cojones