2012-12-31 8 views
9

hereのようなGuiceメソッドレベルのトランザクションを使い始めました。Guice @Transactionalはトランザクションを開始しません

@Inject 
private EntityManager entityManager; 

@Transactional 
public UserSession createSession(User user, String browser) { 
    UserSession session = new UserSession(user, browser); 
    entityManager.persist(session); 
} 

私はwisが十分であるべきだと思ったからです。しかし、トランザクションが開始されないため、エラーが発生します。私が自分で起動しコミットする場合にのみ動作します。

オブジェクトは、Guiceによって、イニシャライザの[アプリケーションの開始]に作成されます。各要求に対して同じインスタンスが使用されます。

なぜ機能しないのですか?

答えて

6

@Transactional方法アノテーションはGuiceのは、これらの注釈付きメソッド呼び出しをインターセプトし、(オプションで)実際のオブジェクトに転送したプロキシオブジェクトを作成することによってFooの要求を満たしている、AOPを通して働きます。

  1. Guiceのは、そうでない場合は代わりにプロキシを提供するために、あらゆる機会を持っていないので、あなたは、Guiceの通過@Transactionalメソッドを持つオブジェクトを作成している:以下に該当することを確認します。

  2. AOPはそれらを簡単に無効にすることができないので、クラスも方法もfinalと表示されません。

  3. JpaPersistModule、またはその他の形式のPersistModuleをインストールしました。そのソースコードから、このモジュールは実際にMethodInterceptor@Transactional注釈にバインドすることに注意してください。これはまさにあなたのニーズに合わない場合は

、あなたは常にあなた自身のメソッドインターセプタを書くことAOP documentationに行くことができることを覚えておいてください。がんばろう!

+0

"オブジェクトもメソッドも最終的なものではありません" "クラス*もメソッドも最終的なものではありません"? –

+0

うん、心のスリップ。一定。 –

2

すべてをもう一度確認した後、動作しませんでした。面白いことは、その間に働いたことですが、たった100回だけです。

追加のテストをした後、私は各リクエストでクラスを再作成する必要があることがわかりました。私はアプリケーションの開始時にそれらを作成する前に。今は完璧に動作しているようです。

ヒントをお寄せいただきありがとうございました。

0

私は、次のような状況で、この問題を持っていたので、私はあまりにも、私はここに私の解決策を投稿しようと思いました:私は理論的にはGuiceのから得ることができるMyDao、およびいくつかの他のオブジェクト:

BusinessLogicは、2つのコンストラクタの引数が必要です私はではない guiceから得る。
BusinessLogicProviderextends AbstactProvider)を作成しましたが、bind(BusinessLogic.class).toProvider(BusinessLogicProvider)では使用しません)。私は今、その後private Provider<MyDao> daoProvider;

@Injectを使用することができ、私のBusinessLogicProviderクラス内bind(BusinessLogicProvider.class);

BusinessLogicProviderpublic BusinessLogic get()方法では、私はその後、BusinessLogicを呼び出すことができます。 は今、私はただのGuiceの-務めたタイプのようなBusinessLogicProviderが結合します必要な2つの引数:daoProvider.get()と私はguiceから得ることができない他のオブジェクトを持つコンストラクタです。

落とし穴:BusinessLogicProvider@Injectprivate Provider<MyDao> daoProvider;はタイプProvider<MyDao>(ただしタイプMyDaoのあるSimpy)ではない場合、それは動作しません。
MyDaoでguiceから来た場合でも、BusinessLogicをインスタンス化するたびにguiceは新しいものを作成する必要があります。

1

私はあなたのような問題があり、@ javax.transaction.Transactionalから@ com.google.inject.persist.Transactionalに切り替えることで解決しました。明らかにGuice-Persistは、Java Transaction APIの@Transactionalアノテーションをサポートしていません。

関連する問題