データベースにすでに永続化された JPA エンティティがあります。
一部のフィールドが変更された、(別の ID を持つ) コピーが必要です。
これを行う最も簡単な方法は何ですか? お気に入り:
@Id
フィールドをに設定してnull
永続化すると機能しますか?- エンティティのクローン メソッドを作成する必要がありますか (を除くすべてのフィールドをコピーします
@Id
)? - 他のアプローチはありますか (クローン フレームワークを使用するなど)?
を使用しEntityManager.detach
ます。Bean が EntityManager にリンクされなくなります。次に、Id を新しい Id (自動の場合は null) に設定し、必要なフィールドを変更して永続化します。
私は今日同じ問題に直面しています:データベースにエンティティがあり、次のことをしたい:
次の手順を実行することに成功しました:
@PersistenceContext(unitName = "...")
private EntityManager entityManager;
public void findUpdateCloneAndModify(int myEntityId) {
// retrieve entity from database
MyEntity myEntity = entityManager.find(MyEntity.class, myEntityId);
// modify the entity
myEntity.setAnAttribute(newValue);
// update modification in database
myEntity = entityManager.merge(myEntity);
// detach entity to use it as a new entity (clone)
entityManager.detach(myEntity);
myEntity.setId(0);
// modify detached entity
myEntity.setAnotherAttribute(otherValue);
// persist modified clone in database
myEntity = entityManager.merge(myEntity);
}
注意: デバッグ モードで「persist」コマンドの後にクローン ID が変更されたことに気付いたとしても、「merge」の代わりに「persist」を使用すると、最後のステップ (クローンの永続化) が機能しません。
私がまだ直面している問題は、デタッチする前に最初のエンティティが変更されていないことです。