このようなコードがあります:
ATransaction.commit ();
BTransaction.commit ();
両方のトランザクションは異なるスキームで動作しています(つまり、永続性ユニットは異なります)。1つのトランザクションで両方を組み合わせる必要があります。したがって、いずれかのトランザクションが両方のロールバックに失敗した場合。どうやってするの?
このようなコードがあります:
ATransaction.commit ();
BTransaction.commit ();
両方のトランザクションは異なるスキームで動作しています(つまり、永続性ユニットは異なります)。1つのトランザクションで両方を組み合わせる必要があります。したがって、いずれかのトランザクションが両方のロールバックに失敗した場合。どうやってするの?
自分でトランザクションを管理しているようです。通常、JavaEEコンテナがそのようなケースを処理します。この場合、JTAは2フェーズコミットを使用します。これはまさにこのような状況に適しています。
自分でトランザクションを管理している場合は、もう少し複雑です。問題は、最初のコミットを実行し、2番目のコミットが失敗した場合、最初のコミットをロールバックできなくなることです。
あなたの場合、私は次のことを提案します。オブジェクトを変更した場合、Hibernateはデータベースに変更をすぐに書き込まないため、通常、コミットは失敗するだけです。これは、Hibernateが「フラッシュ」を実行するときに発生します。これは、クエリが実行される前に自動的に実行されます。クエリが実行される前に、すでに変更したオブジェクトの影響を受ける可能性があります。また、トランザクションがコミットされる前にも実行されます。
したがって、最初に両方のエンティティマネージャをフラッシュするだけで、両方のデータベースにすべての変更が書き込まれ、次に両方のトランザクションがコミットされます。これにより、失敗することはなくなります。
このようなもの:
entityManager1.flush();
entityManager2.flush();
entityManager1.getTransaction().commit();
entityManager2.getTransaction().commit();
ただし、このようなケースを手動で管理するのではなく、代わりにコンテナに管理させることをお勧めします。