2012-04-29 6 views
1

IRCで、EJB更新メソッドでエンティティのリレーションシップをマージするときにコピーされたサブリストを作成するように指示されました。私の質問です:これは本当に必要ですか?JPA merge()を関係(eclipselink、glassfish 3.1)で安全に使用する

ここに私のコードは関係は次のように定義されています...

(CtCaseEJB中)

public CtCase update(CtCase pCase) 
    { 
    CtCase aCtCase = em.merge(pCase); 
    ... 
    List<CtCaseTest> aCaseTestList = pCase.getCaseTests();    
    List<CtCaseTest> aNewCaseTestList = new ArrayList<CtCaseTest>(); 
    for(CtCaseTest aCaseTest : aCaseTestList) 
    { 
     aCaseTest = em.merge(aCaseTest); 
     aNewCaseTestList.add(aCaseTest); 
    } 
    aCtCase.setCaseTests(aNewCaseTestList); 
    ... 
    return aCtCase; 
} 

です:(CtCaseに)

private List<CtCaseTest> mCaseTests = new ArrayList<CtCaseTest>(); 

@OneToMany(mappedBy = "ctCase", cascade = { CascadeType.PERSIST, CascadeType.REFRESH }) 
@OrderBy("rank") 
public List<CtCaseTest> getCaseTests() 
{ 
    return mCaseTests; 
} 

public void setCaseTests(List<CtCaseTest> pCaseTests) 
{ 
    mCaseTests = pCaseTests; 
} 

方法Iこれは、私は現在、それをやっていますが、私は非常に時折ウンキーな行動を取っています(2倍のリストは何とか作成された)。

私の質問は:なぜ私はCascadeType.MERGEを追加することはできませんし、単にCtCaseEJBでこれを行う...

public CtCase update(CtCase pCase) 
    { 
    return em.merge(pCase); 
    } 

なぜ手動でJPA/EJBでの関係をマージするために必要なのでしょうか?

答えて

1

手動でマージする必要はありません。追加CascadeType.MERGEを追加してください。 equals()hashcode()が正しく機能するように正しく実装されていることが重要です。 なぜあなたが "怪しい"振る舞い、リストの倍増などを見ているのは、equals()および/またはhashcode()に何か問題があることです。

問題点:今後の問題を避けるため、提供されたリストのコピーをsetTestCase()に作成します。

+0

ありがとうございました。 JPAのsetList()メソッドで常にコピーコンストラクタを使用するという一般的な原則はありますか?または、このインスタンス固有のものです。 – teefal

+0

一般的です。 – esej

+0

equals()とhashcode()は、エンティティ固有のID(存在する場合)を使用するだけで十分ですか? – teefal

関連する問題