2012-04-29 4 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; 
} 

Это, как я В настоящее время я делаю это, хотя я получаю какое-то очень случайное поведение (удваиваются списки созданный как-то).

Мой вопрос: почему я не могу добавить CascadeType.MERGE и просто сделать это в CtCaseEJB ...

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

Почему необходимость вручную слияния отношения в JPA/EJB?

ответ

1

Не нужно вручную сливать. Добавьте CascadeType.MERGE. Важно, чтобы ваши equals() и hashcode() были правильно выполнены для этого. Мое лучшее предположение, почему вы видите «неуклюжие» поведение, удвоение списка/etc, заключается в том, что что-то не так с equals() и/или hashcode().

Боковой пункт: я бы сделал копию предоставленного списка в setTestCase(), чтобы избежать будущих проблем.

+0

Спасибо. Вы говорите как общий принцип всегда использовать конструкторы копирования в методах setList() в JPA? Или это конкретный случай. – teefal

+0

В общем да. – esej

+0

Достаточно ли для equals() и hashcode() использовать уникальный идентификатор сущностей (если он существует), возможно, не уникальное значение munging (если еще нет)? – teefal

Смежные вопросы