22

EntityManagerのremove(Object entity)メソッドは、 find()メソッドから取得したオブジェクトでのみ機能しますか?

次のコードスニペットがあります。

public void deletePerson() {
    EntityManager em = getEntityManager();
    Person p = new Person("x", "y", 200);
    em.remove(p);
}

ただし、データベースから特定のエントリを削除するわけではありません。

私が以下のようなことを試みたとき:

public void deletePerson() {
    EntityManager em = getEntityManager();
    Person p = em.find(Person.class, 200);
    em.remove(p);
}

正常に動作しています。

4

4 に答える 4

26

JPAエンティティオブジェクトの削除に関するObjectDBのマニュアルからの引用:

データベースからオブジェクトを削除するには、最初にオブジェクトを取得する必要があり(どちらの方法でも)、次にアクティブなトランザクションで、removeメソッドを使用してオブジェクトを削除できます。

引数がエンティティクラスのインスタンスではない場合、またはデタッチされたエンティティである場合、IllegalArgumentExceptionがremoveによってスローされます。

演算子を使用してオブジェクトを作成するとnew、それは切り離されたエンティティになります。削除する場合は、オブジェクトを永続化する必要があります。

エンティティを取得するときは、永続エンティティを取得しています。

于 2012-07-18T10:59:41.013 に答える
14

その方向に何か。EntityManager.removeは、管理対象エンティティに対してのみ機能します。これらの管理対象エンティティをどのように取得したかは重要ではありません。たとえば、次のようになります。

  • JPQLクエリ経由
  • CriteriaAPIクエリ経由
  • EntityManagerでメソッドを検索
  • 他のエンティティからの関係に従うことによって。
  • 新しいエンティティを作成し、それを永続化しました

ただし、この新しいオブジェクトは管理対象エンティティではないため、単に新しいオブジェクトを作成して削除しようとしても機能しません。また、エンティティはまだ切り離されてはなりません。

エンティティの寿命は次のとおりです。すべて同じトランザクション内にあります(トランザクション外のエンティティは管理されません)。

Entity ent = new Entity(1); //entity is in new state, EntityManager never know
                            //anything about it
em.persist(ent); //entity is managed as long as not disconnected 
                 //from EntityManager
em.clear(); // all previously managed entities, including ent, are now detached

Entity same = em.find(1); //managed same
em.remove(same); // entity is removed
于 2012-07-18T10:59:04.893 に答える
3

はい、マージまたは削除操作の場合は、find()操作を使用してから、取得したエンティティでremoveメソッドを使用する必要があります。

于 2012-07-18T11:06:07.190 に答える
2

を使用すると、ステートメントをJPA実行するだけで、エンティティを取得せずに削除できます。delete

javax.persistence.Query q= entityManager.createQuery("delete from A where id = :id");
q.setParameter("id", "value of id to delete");
int deletedRows = q.executeUpdate();
于 2019-12-30T14:29:38.227 に答える