# Java > Gnral Java > Persistance des donnes >  Probleme cascade Delete-Orphan

## valkeke

Bonjour,

Je dbute avec Hibernate et je n'arrive pas bien saisir la notation Delete-Orphan au niveau des cascades. J'ai lu la doc hibernate et l'exemple Pre/Fils (chapitre 21) mais qd il dise



> Parent p = (Parent) session.load(Parent.class, pid);
> Child c = (Child) p.getChildren().iterator().next();
> p.getChildren().remove(c);
> session.delete(c);
> session.flush();


Ici le child est vraimant effac: donc OK compris !



> Dans notre cas, un Child ne peut pas vraiment exister sans son pre. Si nous effacons un Child de la collection,
> nous voulons vraiment qu'il soit effac. Pour cela, nous devons utiliser cascade="all-delete-orphan".
> <set name="children" inverse="true" cascade="all-delete-orphan">
> <key column="parent_id"/>
> <one-to-many class="Child"/>
> </set>


je ne comprends pas  :8O:  ce qu'apporte cette solution qd on met delete-orphan en plus...

 ::cry::  il y a un truc qui m'chappe.. je dois me mlanger les pinceaux !!

Si vous pouviez m'claircir les ides...
merci

----------


## fr1man

Si tu supprimes le pre, les enfants seront donc orphelins.
L'annotation permet de supprimer ses orphelins au moment de la suppression du pre.
C'est plus clair ?

----------


## JeitEmgie

> Si tu supprimes le pre, les enfants seront donc orphelins.
> L'annotation permet de supprimer ses orphelins au moment de la suppression du pre.
> C'est plus clair ?


Sauf que  c'est la fonction du cascade delete pas du cascade delete-orphan

Le delete orphan sert  viter que des enfants enlevs de la Collection<Child> du parent qui a a t charge par Hibernate ne restent en base mme s'ils n'ont pas t effacs explicitement par des oprations de delete/remove dans la session/l'entity manager.
Dans le cas particulier de @OneToMany avec table intermdiaire, cela permet aussi de nettoyer les records de jointure.

La doc Hibernate est ambige car une fois le delete-orphan spcifi il n'est plus ncessaire de faire "session.delete(c)" : "p.getChildren().remove(c);" suffit.

(l'exemple ici est plus clair)

Pour que delete orphan fonctionne correctement, il faut toujours manipuler la Collection charge par Hibernate (proxified) et ne jamais plus faire de setChildren() explicite pour remplacer une Collection<Child> charge par Hibernate par une Collection<Child> nouvellement cr dans le code Java. Comme on crit parfois du code "universel"  sans trop se proccuper d'o vient l'entit Parent, on peut vite avoir des (mauvaises) surprises

----------


## valkeke

Relation One-to-Many : cascade="delete" au niveau du pre : tu effaces le pre tous les fils sont supprims : ok !

Relation One-to-Many : cascade="delete-orphan" (merci pour le lien !)
Tu n'es pas oblig dappeler session.delete(child) sur tous les fils que tu veux supprimes de la liste.
La mthode Remove casse le lien entre Pre/Fils, la cl trangre dans la table fils est  NULL et comme il y a une relation transitive delete-orphan, le fils est alors supprim.

Je suis d'accord avec toi, la doc d'hibernate n'est pas tjrs tres claire : y-a-t'il un livre qui explique bcp mieux les principes d'hibernate? le best seller d'hibernate...

Une autre question : ma relation est en fait Agence/Conseiller.
Est-ce qu'il y a une tactique pour liminer automatiquement une agence qui ne contiendrait plus de conseiller ?(rgle mtier : une agence existe si et seulement si elle possde un conseiller)
Actuellement, je fais cela manuellement, mais afin d'optimiser le nombre de requte, je souhaiterais qd je fais un remove sur le conseiller et qu'hibernate s'apperoive que la liste est maintenant vide, hibernate supprime l'agence....  ::roll:: j'en demande un peu trop peut-tre
 :8O:  j'espre tre clair..

merci pour vos conseils

----------

