55

データベースにすでに永続化された JPA エンティティがあります。
一部のフィールドが変更された、(別の ID を持つ) コピーが必要です。

これを行う最も簡単な方法は何ですか? お気に入り:

  • @Idフィールドをに設定してnull永続化すると機能しますか?
  • エンティティのクローン メソッドを作成する必要がありますか (を除くすべてのフィールドをコピーします@Id)?
  • 他のアプローチはありますか (クローン フレームワークを使用するなど)?
4

8 に答える 8

62

を使用しEntityManager.detachます。Bean が EntityManager にリンクされなくなります。次に、Id を新しい Id (自動の場合は null) に設定し、必要なフィールドを変更して永続化します。

于 2012-07-24T06:13:54.407 に答える
4

私は今日同じ問題に直面しています:データベースにエンティティがあり、次のことをしたい:

  • データベースから取得する
  • その属性値の 1 つを変更する
  • それのクローンを作成します
  • クローンのいくつかの属性のみを変更します
  • データベースにクローンを永続化する

次の手順を実行することに成功しました:

@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」を使用すると、最後のステップ (クローンの永続化) が機能しません。

私がまだ直面している問題は、デタッチする前に最初のエンティティが変更されていないことです。

于 2016-02-09T09:26:33.027 に答える