2009-05-05 13 views
2

Springを使用し、TransactionInterceptorを使用してHibernateトランザクションを透過的に取得するプログラムで作業しています。これにより、「このメソッドが他のクラスから呼び出されたときに、トランザクション内にこのメソッドが呼び出されたときに、そのメソッドをもう一度呼び出すことは非常に便利です。Springクラス内でHibernateトランザクションを取得する

しかし、私は書き込みを試みる必要があり、成功したかどうかをすぐに見つけなければなりません。とにかく私は2つのメソッドが必要ですが、プロシージャを明示的にトランザクションを作成する必要なしに、同じクラスにそれらを保持する方法があることを期待していました。私はそれを理解するように私はちょうど直接transactionalMethodを呼ぶだろうので、これは動作しないと、残念ながら

public void methodOne() { 
    //..do some stuff 
    try { 
     transactionalMethod();//won't do what I want 
    } catch(OptimisticLockingFailure e) { 
     //..recover 
    } 
} 

@Transactional 
public void transactionalMethod() { 
    //...do some stuff to database 
} 

:実際に、私はこのような何かをしたいと思います。 Springが私のためにローカルメソッドを呼び出し、必要に応じてトランザクションでラップするように頼む方法はありますか、それとも別のクラスになければなりませんか?

答えて

1

クラスが実装するインターフェイスを定義します。これはtransactionalMethod()です。依存性注入を使用してクラスの値を独自の実装に設定します。 Beanの工場では、Springがそのインタフェース実装の周りにAroundのアスペクトを挿入できるようにします。それはあなたのニーズに対応するはずです。

0

transactionalMethodを独自のトランザクションにして、すでにアクティブなトランザクションに参加させるのではなく、REFERIRES_NEWに伝播を設定する必要があります。同様に

@Transactional(propagation = Propagation.REQUIRES_NEW) 
public void transactionalMethod() { 
    //...do some stuff to database 
} 

また、トランザクションマネージャがこの伝播をサポートしていることを確認する必要があります。 transactionalMethosはそれが呼び出された他のトランザクションから完全に分離され、コミット/ロールバックは完全に別個に行われます。