2012-07-18 9 views
20

は、これらのオブジェクトのみの作業がから()メソッドを見つけてしまったのEntityManager(オブジェクトの実体)メソッドを削除していますか?javax.persistence.Entitymanager:削除()メソッド

は、私は次のコードスニペットがあります

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); 
} 

するとそれが正常に動作しています:私は以下のようなものを試してみました

答えて

24

するために、最初に を検索し、アクティブなトランザクションで取り出したオブジェクトをデータベースから削除する場合は、removeメソッドを使用して を削除できます。

引数が でない場合、エンティティクラスのインスタンスであるか、またはそれが分離エンティティである場合、IllegalArgumentExceptionがスローされます。

newオペレータでオブジェクトを作成し、それが切り離さエンティティになり、あなたはそれを削除したい場合は、それを永続化する必要があります。

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

+0

em.remove(em.merge(person)) - 人物がデータベースから取得された場所 - オブジェクトを削除する正しい方法? – dendini

+0

@dendiniいいえ、 'person'がデータベースから取得された場合、それはデータベースに存在することを意味します。ですから、この場合、直接 'em.remove(person)'を呼び出すことができます。 –

+3

したがって、SELECTとDELETEが必要です。これは2つのクエリであり、1つのネイティブDELETEで実行できます。なぜJPAについては冗長なのでしょうか? – sura2k

13

何かその方向に。 EntityManager.removeは、管理対象エンティティに対してのみ機能します。どのようにこれらの管理対象エンティティを取得した問題ではない、それは例えばなります

  • JPQLクエリ
  • 経由のEntityManager
  • における基準APIのクエリ
  • findメソッドを経由して他のエンティティからの関係を次のようで。
  • は、新しいエンティティを作成し、それ

しかし、単に新しいオブジェクトを作成し、この新しいオブジェクトは、エンティティを管理されていないので、それは動作しません削除しようとしているが持続しました。また、エンティティはまだ分離してはいけません。次のように実体の

人生は(そのトランザクション外実体が管理されていない)すべて同じトランザクション内で、非常に多くのです:

deleting JPA entity objectsにObjectDBのマニュアルから引用し
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 
+0

ありがとうございます。今私は分離された実体の考えを得ました。それでも、「エンティティが存在しないか、何かが存在しない」という例外が投げられるべきだと思う。 – sachinpkale

3

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

関連する問題