web-dev-qa-db-ja.com

javax.persistence.Entitymanager:remove()メソッド

remove(Object entity)メソッドEntityManagerは、から取得したオブジェクトに対してのみ機能しますか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);
}

それはうまく機能しています。

21
sachinpkale

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

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

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

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

エンティティを取得する場合、永続エンティティを取得しています。

26
JMelnik

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

  • jPQLクエリ経由
  • criteria APIクエリ経由
  • 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
13
Mikko Maunu

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

3
Mukul Goel