1

IRC でしばらく前に、EJB 更新メソッドでエンティティの関係をマージするときに、コピーされたサブリストを作成するように言われました。私の質問は次のとおりです。これは本当に必要ですか?

これが私のコードです...

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

これは私が現在行っている方法ですが、非常に時折不安定な動作が発生しています(二重リストが何らかの形で作成されています)。

私の質問は、CascadeType.MERGE を追加して、単に CtCaseEJB でこれを行うことができないのはなぜですか...

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

JPA/EJB でリレーションシップを手動でマージする必要があるのはなぜですか?

4

1 に答える 1

1

手動でマージする必要はありません。追加してくださいCascadeType.MERGEequals()これが機能するには、とhashcode()が適切に実装されていることが重要です。equals()「おかしな」動作、リストの倍増などを見ている理由についての私の最善の推測は、 and/orに何か問題があるということですhashcode()

setTestCase()補足:将来の問題を回避するために、提供されたリストのコピーを作成します。

于 2012-04-29T13:14:33.423 に答える