2011-10-30 31 views
2

OneToMany関係からエンティティを削除する際に、最小限の労力が必要です。私は、これらのセットにエンティティを追加するだけで多くの例が見つかる(それはうまくいく)が、エンティティを削除することははるかに難しい。OneToMany関係のエンティティを削除します

私は以下のクラスがあります。私はそれが製品や専門家で満たされてい

@Entity 
public class Product { 
    ... 
    OneToMany(mappedBy="product", orphanRemoval=true, 
       cascade={CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH},fetch=FetchType.EAGER) 
    Set<Expert> experts = new HashSet<Expert>(); 
    ... 
} 

@Entity 
public class Expert { 
    ... 
    @ManyToOne(optional=false) 
    Product product; 

    @ManyToOne(optional=false) 
    Person person; 

    ... 
} 

(人が製品に似ている)

を。私は、エキスパートエンティティが完全に削除されるように、エキスパートを製品リストから削除したいと思います。私は、次のコードのいずれかが十分であろうと期待される:

Product aProduct = findAProduct(...); 
Expert anExpert aProduct.getExperts.get(...); // Just get the first expert that I want removed 
EntityManager em = entityManager(); 

    em.getTransaction().begin(); 
    aProduct.getExperts().remove(anExpert); 
    em.merge(aProduct); 
    em.getTransaction().commit(); 

か:

em.getTransaction().begin(); 
    em.remove(anExpert); 
    em.getTransaction().commit(); 

はこの単純すぎますか? JPAによって何が行われ、自分は何をしなければならないのですか?以前はクエリを使用して解決しましたが、JPAがこれを実行できると期待しています。

+1

これら2つの手法を試しましたか?それは何を与えるのですか? –

答えて

1

EntityManager em = entityManager(); 
// Retrieve the expert in the new EntityManager context 
Expert expertToDelete = em.find(Expert.class, anExpert.id); 

em.getTransaction().begin(); 
expertToDelete.getProduct().getExperts().remove(expertToDelete); 
expertToDelete.getPerson().getExperts().remove(expertToDelete); 
em.remove(expertToDelete); 
em.getTransaction().commit(); 

それは非常によく、代わりに検索を経由して、専門家を取得する、あなたの代わりにanExpertにマージ()を使用できることかもしれないが、上記はうまくいくようです。

1

試してみてください。

em.getTransaction().begin(); 
aProduct = em.merge(aProduct); 
aProduct.getExperts().remove(anExpert);  
em.getTransaction().commit(); 

問題はありません削除して、マージ操作です。

1

私の過去の経験に基づいて、Hibernateで親子の双方向関係の子を削除するのは非常に難しいことがあります。

代わりに単方向マッピングを使用します。つまり、プロダクトには専門家がいません。しかし、Hibernateコールを使用するすべてのエキスパートを取得するゲッターを実装できます。利点は以下のとおりです。

  1. 簡単にマッピング
  2. 簡単にコーディング
  3. 扱いbehviour

あなたはいつも戻ってくると、キャッシュまたは後の段階でフェッチ熱心に実装することができます。ほとんどの場合、それらは不要な成熟前の最適化です。それは作業を取得する方法は、次の操作を行うことでした

関連する問題