を失う/このコードで休止状態:間接的にHibernate/JPAのメソッド呼び出しは、私は春/ JPA2を使用していたトランザクション
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()に注釈を付けることは私の意図ではありません。私はプロキシモードをアスペクトモードに変更していません。 ありがとう! – Cojones
'B.outer()'のロジックが 'Binner()'の前に発生する必要があるが、トランザクション/持続性に関係しない場合は、あなたのパーシスタンス層クラス(DAL/DAOなど)に属していない可能性があります。中間オブジェクトを使用しても問題を分離するようにデザインをリファクタリングすることを検討してください。 'Object intermediate = b.outer(); b.inner(中間); '。そしてリファクタリングして、それはもはやあなたのパーシスタンス層クラスのメンバーではありません。 'Object intermediate = someOtherUtilityOrSupportClassInstance.outer(); b.inner(中間); '。 – Dan
私は今LTWに切り替えましたが、今はどんな呼び出しでもトランザクションが発生しません:(すべての設定は 、
Cojones