2012-04-29 1 views
1

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?

Répondre

1

Il n'est pas nécessaire de fusionner manuellement. Ajoutez CascadeType.MERGE. Il est important que votre equals() et hashcode() soit correctement implémenté pour que cela fonctionne. Ma meilleure estimation de la raison pour laquelle vous voyez un comportement "bancal", doublant la liste/etc, est qu'il y a un problème avec le equals() et/ou le hashcode().

Un point secondaire: Je voudrais faire une copie de la liste fournie dans setTestCase(), pour éviter les problèmes futurs.

+0

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

+0

En général oui. – esej

+0

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

Questions connexes