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.MERGE。重要的是您的equals()hashcode()正确实施以使其正常工作。我对为什么你会看到“古怪”行为、列表/等加倍的最佳猜测是equals()and/or有问题hashcode()

附带一点:我会复制 中提供的列表setTestCase(),以避免将来出现问题。

于 2012-04-29T13:14:33.423 回答