2

すでに JPA と guice-persist を使用している既存の j2se プロジェクトがあります。ここで、JMS 機能を追加したいので、2 フェーズ コミットと JTA の要求があります。コンテナーがないため (Spring など)、bitronix トランザクション マネージャーを使用します。

私の理解では、最初にやらなければならないことは、永続化ユニットの transaction-type を から に変更することですRESSOURCE-LOCALJTAこれは、データベース トランザクションがcommitではなくcommitに投票するようにするためです。コミットは、すべての投票を収集した後、フェーズ 2 で行われます。

guice-persist@Transactionalでは、単一のトランザクションで実行する必要があるメソッドにアノテーションを使用します。はEnitiyManagerFactory を提供し、注釈付きメソッドをラップするJPAPersistModuleように、guice-persist 内部クラスに使用されます。JpaLocalTxnInterceptor

今、私は次のような例外を受け取ります

java.lang.IllegalStateException: A JTA EntityManager cannot use getTransaction()
at org.hibernate.ejb.AbstractEntityManagerImpl.getTransaction(AbstractEntityManagerImpl.java:1009)
at com.google.inject.persist.jpa.JpaLocalTxnInterceptor.invoke(JpaLocalTxnInterceptor.java:57)
    ...

提供されたエンティティマネージャーのJpaLocalTxnInterceptor呼び出しのため。getTransaction()

現時点では、かなり行き詰まっています。guice-persist を JTA と一緒に使用する方法はありますか? それともプロジェクトから guice-persist を削除する必要がありますか? または、(Bitronix を使用して) JTA を実行したい場合、guice-persist に代わるものはありますか?

4

1 に答える 1

2

同様の状況がありました。私たちの場合、Guice + Jooq を使用していました。大規模なレガシーRails DBがあり、細かい制御と速度が必要だったため、Jooqが必要でした。Spring よりも Guice を選択したのは、それがより優れたフレームワークであり、はるかに高速であり、コンパイル時間のチェックが好きだからです。

Jooq では Guice persist を使用できなかったので、次のようにします。

  • Atomikos JTA(無料版)を利用する
  • 独自の @Transactional AOP アノテーション インターセプターを作成しました。
  • 注入可能なサービスは、jooq プロセッサに java.sql.Connection を提供しますが、常に Atomikos DataSource Bean を提供します。

基本的にこのコードを変更しました:

http://www.dailyjavatips.com/2011/10/24/database-transactions-google-guice-aop/

この例では通常の JDBC Tx を使用していますが、代わりに Atmomikos の JTA 対応 Tx を使用するように変更しました。

魔法のように動作します!

オジェ

于 2013-03-25T18:40:04.067 に答える