En Grails, je peux mettre en œuvre un N: 1 relation comme ceci:Quand faut-il hasMany être utilisé pour N: 1 relations dans les classes de domaine de Grails?
class Parent { hasMany = [children:Child] }
class Child { belongsTo = [parent:Parent] }
maintenant (si addTo et removeFrom est toujours correctement utilisé) je peux obtenir les enfants d'un parent par l'intermédiaire parent.children.
Mais je peux aussi le faire sans hasMany:
class Parent { }
class Child { belongsTo = [parent:Parent] }
Puis-je utiliser Child.findAllByParent (parent) pour tous les enfants.
Ma question: Y a-t-il des raisons importantes pour lesquelles je devrais utiliser hasMany si peut interroger un des enfants de parents de la seconde manière aussi?
Je suppose qu'il est parfois plus facile (et peut-être plus rapide si recherché avec le parent?) De simplement se référer à parent.children, mais d'autre part cette liste peut devenir assez longue quand il y a plusieurs enfants. Et ce que je n'aime pas, c'est que vous devez toujours faire attention à l'addTo ou removeFrom ou effacer la session après avoir ajouté un nouvel enfant avec un parent pour que grails le fasse automatiquement ...
Is la réponse que vous devez simplement utiliser hasMany s'il y a peu d'enfants et ne l'utilisent pas s'il y a beaucoup (pour des raisons de performance), ou est-il plus derrière elle?
Merci, donc tout est dans le comportement en cascade. Diriez-vous que la performance n'est pas un problème lorsque la liste à gérer pour les enfants devient très grande? En ce qui concerne votre mise à jour, malheureusement sauver avec flush: vrai n'est pas suffisant pour addTo/removeFrom automatique. Comme je l'ai appris dans mon article Grails soumis https://cvs.codehaus.org/browse/GRAILS-6356, vous devez effacer la session avec sessionFactory.currentSession.clear() si vous voulez réaliser cela à l'intérieur d'un test ou d'un contrôleur . Dans une production échafaudée, cela fonctionne parce que la session est effacée après l'action de sauvegarde/mise à jour de l'enfant. –
Juste testé et il semble que la suppression en cascade est le contraire de ce que vous dites au début: Dans mon premier exemple (avec hasMany), lors de la suppression d'un parent, tous les enfants sont également supprimés. Dans l'exemple SECOND (sans hasMany), les enfants doivent être supprimés manuellement avant de supprimer un parent. –
En fait, mes tests ont également révélé que dans votre exemple avec hasMany et no belongsTo, la suppression du parent n'entraîne PAS un parent nul pour les enfants mais une exception DataIntegrityViolationException ... Je dois mettre les parents des enfants à zéro avant la suppression . –