2010-07-30 31 views
2

J'ai des problèmes avec une relation parent-enfant ici. Quand je persiste du côté de la collection (côté enfant), j'ai 2 nouveaux enfants au lieu d'un.hiberner bidirectionnel insère un à plusieurs insère des doublons

Voici est-sont les applications de mise en veille prolongée:

<set name="children" inverse="true" 
     cascade="all,delete-orphan" lazy="true" 
     order-by="CHILD_ID desc"> 
     <key column="PARENT_ID" /> 
     <one-to-many class="com.mycompany.Child" /> 
    </set> 
    <many-to-one name="parent" class="com.mycompany.Parent" not-null="true"> 
     <column name="PARENT_ID" /> 
    </many-to-one> 

Voici le code java utilisé pour ajouter l'enfant dans la relation bidirectionnelle:

// Persist logic... 
Parent p = myParentService.findById(1); 
Child c = new Child(); 
p.addChild(c); 
myChildService.persist(child); 

// Inside the parent class... 
public void addChild(Child child) 
{ 
    if (this.children == null) 
     this.children = new LinkedHashSet<Child>(); 

    this.children.add(child); 
    child.setParent(this); 
} 

Si je supprime la « this.children.add (enfant);" part tout fonctionne comme prévu. Ceci est déroutant car la documentaion Hibernate here dit que les relations bidirectionnelles sont censées fonctionner de cette façon. Qu'est-ce que je rate?

+0

est setParent également ajouter l'enfant? –

+0

Non, setParent ne fait qu'un simple assign. – user333903

+0

La façon de gérer l'association bidirectionnelle est correcte, vous devez définir les deux côtés du lien. Mais que voulez-vous dire exactement par * Je reçois 2 nouveaux enfants *? Où? Dans la base de données? Dans la collection? Tous les deux? Comment avez-vous implémenté 'equals' /' hashCode'? Utilisez-vous le 'id 'dans votre implémentation? Pouvez-vous réellement le montrer? –

Répondre

1

Vous avez activé la conservation en cascade sur la collection du parent, il n'est donc pas nécessaire d'appeler persister explicitement sur l'entité enfant. Si le parent est dans l'état géré, le nouvel enfant sera conservé la prochaine fois qu'une transaction sera validée/il y aura une synchronisation. La cascade n'est pas activée dans la documentation d'exemple que vous avez liée.

+0

Voulez-vous dire que le style cascade provoque une entrée enfant en double? – user333903

+0

@caleb L'activation de la cascade ne doit pas entraîner de doublons dans les entrées. –