2009-08-24 6 views
1

Désolé si cela est dupe, n'a pas pu trouver, mais ne savait pas vraiment quoi chercher, de toute façon ...Cascading in (N) Hibernate, quelles règles ai-je besoin?

J'ai trois classes, Parent, Child et Other

Parent a beaucoup Child où enfant a une colonne Parent_Id

Other contient une référence à un Child par une colonne Child_Id

Quand je supprimer un Parent, je veux également supprimer tous les objets associés Child. Si ces objets Child sont référencés par des classes Other, je veux que leurs références (les objets Other) Child_Id soient annulées.

De quelles règles en cascade ai-je besoin sur les deux relations?

NHibernate mettra également à jour les entités en mémoire ainsi que dans la base de données?

I.e. si j'ai un groupe de Parent, Child et Other en mémoire (c'est-à-dire chargé à partir de db, non transitoire) et dire à NH de supprimer Parent, que va-t-il se passer? Je suppose que les objets Parent et Child deviendront transitoires? Qu'adviendra-t-il de la propriété Child de tous les objets Other? Edit: lorsque vous utilisez All-Delete-Orphan, que classe un objet comme un orphelin? Dans l'exemple ci-dessus, un Child est-il orphelin si son parent Parent est supprimé? La référence de Other est-elle importante lorsqu'on considère une entité comme orpheline?

Merci

Répondre

1

NH ne met pas à jour l'un de vos entités en mémoire (à l'exception des Ids et versions). NH n'est pas responsable de gérer les relations de vos entités. Il persiste juste ce que vous avez fait en mémoire à la base de données.

De ce point de vue, il devrait être plus facile à comprendre.

cascade="delete" signifie que lorsque le parent est supprimé, l'enfant est également supprimé. cascade="delete-orphan" signifie que, de plus, l'enfant est même supprimé si aucun parent n'y fait plus référence. Ceci, bien sûr, ne fonctionne que si l'enfant est dans la session.

L'instance supprimée est transitoire en mémoire. Les références à l'instance transitoire (à partir de Other) provoqueront une exception. AFAIK, vous devez supprimer la référence aux instances supprimées par vous-même. Vous pouvez probablement le rendre implicite par quelques astuces, mais je doute que ce sera propre. C'est la logique métier.

Pour les relations parent-enfant, cascade="all-delete-orphan" est approprié.

Pour référence régulière, je préfère cascade="none".

Il y a un great explanation by Ayende Rahien

+0

Merci pour la clarification.Si j'avais un un-à-plusieurs de «Enfant» à «Autre», je pourrais mettre en cascade à enregistrer-mise à jour et cela me donnerait la fonctionnalité que j'avais besoin, non? sauf que je ne veux pas avoir une relation bidirectionnelle, je veux seulement pouvoir aller de 'Other' à' Child', pas l'inverse. –

+0

Je ne voudrais pas sauvegarder-mettre à jour Autre parce que vous enregistrez l'enfant. En supposant que l'Autre est une entité indépendante, créée et supprimée indépendamment de l'enfant, elle ne doit pas être créée implicitement en créant un enfant. Pour moi, c'est une bonne pratique. Je ne vois pas pourquoi vous pensez que cela résoudrait votre problème. De toute façon, vous devez supprimer la référence à l'enfant de l'Autre. Bien sûr, vous trouverez le référencement d'autres plus facile. –

+0

hmm non vous avez raison, d'accord. cela signifie-t-il que j'ai besoin de charger tous les 'Other's dans la mémoire, puis annuler leurs références' Child'? semble cher: s –

Questions connexes