(どのように)すべてをDTOにコピーせずに、複数のサーバーのデータベースでJPAエンティティを永続化することは可能ですか?
分散システムがあります。一部のアプリケーションには、キャッシュ用のDBがあります。JPAプロバイダーは、デタッチされたオブジェクトを永続化できないと文句を言う例外をスローします。
ただし、この追加のDBに永続化するだけで、エンティティのIDを保持したいと思います。
(JPA 1.2、EJB 3.0、Glassfish v2.1、Toplink Essentials)
(どのように)すべてをDTOにコピーせずに、複数のサーバーのデータベースでJPAエンティティを永続化することは可能ですか?
分散システムがあります。一部のアプリケーションには、キャッシュ用のDBがあります。JPAプロバイダーは、デタッチされたオブジェクトを永続化できないと文句を言う例外をスローします。
ただし、この追加のDBに永続化するだけで、エンティティのIDを保持したいと思います。
(JPA 1.2、EJB 3.0、Glassfish v2.1、Toplink Essentials)
em.persist(obj) ではなく、em.merge(obj) だけです。マージは、アタッチされたオブジェクトとデタッチされたオブジェクトの両方で機能します。
切り離されたオブジェクトから始める場合は、オブジェクトをそれぞれの EntityManagers とマージします。オブジェクト間で同じ 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);
そのようなものはうまくいくはずです。