2012-04-29 1 views
1

IRC에서 EJB 업데이트 방법으로 엔티티의 관계를 병합 할 때 복사 된 하위 목록을 작성해야한다고 들었습니다. 내 질문은 : 이것은 정말로 필요한가? 로JPA merge()를 관계 (eclipselink, glassfish 3.1)로 안전하게 사용하기

여기 내 코드의 ...

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

(CtCaseEJB에서)

는 관계가 정의됩니다

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

이것은 어떻게

(CtCase에서) I 현재 나는 그것을하고있다. 비록 내가 아주 우발적 인 우스꽝스러운 행동을하고있다. 어떻게 든 창조됨).

내 질문은 : 왜 CascadeType.MERGE을 추가 할 수 없습니다 단순히 CtCaseEJB에서이 작업을 수행 ...

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

왜 수동으로 JPA/EJB의 관계를 통합의 필요성?

답변

1

수동으로 병합 할 필요가 없습니다. CascadeType.MERGE을 추가하십시오. equals()hashcode()이 제대로 작동하려면 올바르게 구현해야합니다. 내가 왜 "괴상한"행동을 보는지,/etc를 두 배로 늘린 것은 equals() 및/또는 hashcode()에 문제가 있다는 것입니다.

부작용 : 향후 문제를 피하기 위해 제공된 목록의 복사본을 setTestCase()에 작성합니다.

+0

감사합니다. JPA의 setList() 메소드에서 항상 복사 생성자를 사용하는 것을 일반적인 원칙으로 말하고 있습니까? 또는이 인스턴스는 구체적입니다. – teefal

+0

일반적으로 예. – esej

+0

equals() 및 hashcode()가 엔티티 고유 ID (존재하는 경우)를 사용하는 것이 좋으며, 고유 값을 지정하지 않을 수도 있습니다 (아직 입력하지 않은 경우). – teefal