2011-09-19 2 views
4

Je voulais clarifier une supposition que j'ai faite, concernant la fonctionnalité de Hibernate. Supposons que j'ai une classe de A avec un mappage @OneToMany avec B. Ces Bs ont chacun une référence parent A pour soutenir un attribut mappedBy sur A.Hibernate - retrait de l'article de la collection

Lorsque supprimer un B de la collection en A, fait mise en veille prolongée ont la capacité de null automatiquement le champ parent à l'intérieur de B?. De tous les tests que j'ai effectués, lors de la suppression d'un élément d'une collection, il ne met pas réellement à jour la base de données en modifiant la référence parente dans l'enfant.

This link semble prendre en charge ma revendication car ils annulent manuellement la référence parente, en plus de la retirer du parent Set.

Répondre

6

Chaque fois qu'une association est mappée à partir des deux extrémités, l'une de ces extrémités est désignée active et l'autre est l'extrémité passive. (La fin passive est celle cartographiée à l'aide mappedBy= ou inverse="true")

Mise en veille prolongée ne fonctionne pas et ne peut pas, mettre à jour la fin passive d'une collection lorsque l'extrémité active est modifiée, car il peut détecter ces changements seulement au temps de rinçage. Par conséquent, il est recommandé d'appeler le code pour modifier les deux extrémités de l'association, afin de garantir que le modèle objet est toujours dans un état cohérent. Hibernate elle-même ne se soucie pas de savoir si les deux extrémités de l'association sont cohérentes, car elle ne regarde que l'extrémité active lors du vidage dans la base de données.

Lors du mappage d'une association un-à-plusieurs, l'extrémité un-à-plusieurs doit être qualifiée de passive. La section du manuel d'hibernation que vous liez aux tentatives d'expliquer pourquoi.

Questions connexes