Il y a quelque temps sur IRC, on m'a dit de créer des sous-listes copiées lors de la fusion des relations d'une entité dans ma méthode de mise à jour EJB. Ma question est la suivante: est-ce vraiment nécessaire?en toute sécurité en utilisant JPA merge() avec les relations (eclipselink, glassfish 3.1)
Voici mon code ...
(en 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;
}
La relation est définie comme:
(en 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;
}
Voilà comment je Je suis en train de le faire, même si je reçois un comportement bizarre très occasionnel (les listes doublées obtiennent créé en quelque sorte).
Ma question est: pourquoi ne puis-je ajouter CascadeType.MERGE et il suffit de faire cela dans CtCaseEJB ...
public CtCase update(CtCase pCase)
{
return em.merge(pCase);
}
Pourquoi le besoin de relations fusion manuellement dans JPA/EJB?
Merci. Voulez-vous dire comme principe général de toujours utiliser les constructeurs de copie dans les méthodes setList() dans JPA? Ou est cette instance spécifique. – teefal
En général oui. – esej
Est-il suffisant que equals() et hashcode() utilisent l'ID unique d'entité (s'il existe), avec éventuellement une valeur non unique (si ce n'est pas déjà fait)? – teefal