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での関係をマージするために必要なのでしょうか?
ありがとうございました。 JPAのsetList()メソッドで常にコピーコンストラクタを使用するという一般的な原則はありますか?または、このインスタンス固有のものです。 – teefal
一般的です。 – esej
equals()とhashcode()は、エンティティ固有のID(存在する場合)を使用するだけで十分ですか? – teefal