0

単純なエンティティを永続化しようとしていますが、エラーなしでデータベースに永続化されません。私はglassfish 3.1.2、hibernate 4.1.3.Final、トランザクションスコープ/コンテナ管理のentitymanagerを使用しています。jta トランザクションが persistence.xml で構成され、jta データソースが正しく設定されている。これは、デフォルトのトランザクション レベル (REQUIRED) を持つステートレス セッション Bean です。コンソールで、Hibernate の TransactionCoordinatorImp から「自動結合チェックにより JTA 同期登録をスキップしています」というメッセージが数回表示されます。entitymanager.find を使用して、手動で挿入されたエンティティを見つけることができました。しかし、永続化またはマージできませんでした。何が問題になる可能性がありますか?

更新: この問題は、「自動参加​​チェックのため JTA 同期登録をスキップしています」というメッセージとは関係がないようです。トランザクション分離レベルを REQUIRES_NEW に設定すると新しいエンティティが追加されますが、分離レベルを REQUIRED に設定すると永続化されません。このメソッドは、jax-rs Web サービス呼び出しを受け取る最初のメソッドでした。REQUIRES_NEW 分離レベルが必要なのはなぜですか?

4

1 に答える 1

2

あなたはあなたのセットアップについてほとんど十分な詳細を与えていないので、私は一般的にしか答えることができません。

スキップ同期登録ビットは実際にこれに影響します。これは、JPAがトランザクション参加と呼ぶものの一部です。基本的な原則は、EntityManagerは、作成時にアクティブでなかったトランザクションに(仕様により)自動的に参加することを許可されていないということです。疑似コードでは、次の違いがあります。

// start transaction
// create EntityManager
// use EntityManager
// commit transaction

と:

// create EntityManager
// start transaction
// use EntityManager
// commit transaction

最初のケースでは、EntiytManagerはアクティブなトランザクションのスコープ内に作成されるため、自動的に参加します。2番目のケースでは、アクティブなトランザクションのスコープ外で作成されるため、自動的に参加することはできません。

このような場合、EntityManagerをトランザクションに参加させるには、EntityManager.joinTransaction()を呼び出す必要があります。

// create EntityManager
// start transaction
entityManager.joinTransaction();
// use EntityManager
// commit transaction

これはあなたが自分自身を見つける状況です。それがあなたが期待しているものでない場合、あなたはEntityManagerがトランザクションの範囲外でどのように/なぜ作成されているかを知る必要があります。

于 2012-06-20T16:30:34.973 に答える