同じ JPA エンティティを複数のデータベース (分散システム) で永続化するにはどうすればよいですか?
-
06-09-2019 - |
質問
すべてを DTO にコピーせずに、複数のサーバーのデータベースで JPA エンティティを永続化することは (どのようにして) 可能ですか?
私たちは分散システムを持っています。一部のアプリケーションにはキャッシュ目的の DB があります。JPA プロバイダーは、切り離されたオブジェクトを永続化できないことを示す例外をスローします。
ただし、エンティティの ID をこの追加 DB に永続化するだけで保持したいと考えています。
(JPA 1.2、EJB 3.0、Glassfish v2.1、Toplink Essentials)
解決
em.persist(obj) ではなく、em.merge(obj) だけを使用してください。マージは、アタッチされたオブジェクトとデタッチされたオブジェクトの両方で機能します。
分離されたオブジェクトから始める場合は、オブジェクトをそれぞれの EntityManager とマージします。ID キーをオブジェクト間で同じに保ちたい場合は、マージされた最初のオブジェクトからキーを取得し、今後はそれを使用します。
おそらく (私にはわかりませんが) やりたくないことは、ある EM によって管理されているオブジェクトを別の EM とマージしようとすることです。これが機能するかどうかをテストして確認できますが、試してみると何が起こるかわかりません。
それで。
YourEntity unattachedEntity = ... // your original entity object.
YourEntity managedEntity = em1.merge(unattachedEntity);
// managedEntity now has the primary key assigned by the DB
unattacheEntity.setPrimaryKey(managedEntity.getPrimaryKey());
em2.merge(unattachedEntity);
em3.merge(unattachedEntity);
そのようなものは問題なく動作するはずです。
所属していません StackOverflow