2011-03-29 1 views
3

J'ai une classe de domaine Grails qui est une hiérarchie de catégories. Chaque catégorie a une catégorie parente (à l'exception de la catégorie racine qui est null).Grails GORM self-referential belongsTo supprime la direction opposée à celle attendue

class Category { 
    String name 

    static mapping = { 
     cache true 
     name index:'category_name_idx' 
    } 

    static belongsTo = [parent:Category] 

    static constraints = { 
     parent(nullable:true) 
    } 
} 

Mon problème: supprime cascade exactement à l'opposé de ce que je pense:

  • someSubCategory.delete() supprime la catégorie tente alors de supprimer la catégorie parente (qui échoue avec une violation de l'intégrité si le parent a d'autres enfants). ParentCategory.delete() ne supprime PAS en cascade ses enfants, mais échoue simplement avec une violation d'intégrité.

Qu'est-ce que je fais mal? Ma compréhension est que le 'belongsTo' ci-dessus devrait dire au GORM de castrer les suppressions du parent à tous les enfants, mais pas d'un enfant à son parent.

Répondre

6

Si je comprends bien une catégorie appartient à un parent et un parent peut avoir plusieurs enfants, donc je pense que vous avez besoin d'une relation hasMany, quelque chose comme ceci:

class Category { 
    String name 

    static mapping = { 
     cache true 
     name index:'category_name_idx' 
    } 

    static belongsTo = [parent:Category] 
    static hasMany = [children: Category] 

    static constraints = { 
     parent(nullable:true) 
    } 
} 

j'avais similaire structures et ne jamais avoir des problèmes avec la suppression de le faire de cette façon.

Espérons que cela aide!

+0

Merci, @maricel! C'est évident avec le recul ... se sentir un peu idiot. –

+0

Je suis content que ça a marché :-) – Maricel

1

Ce n'est pas une réponse, mais j'ai trouvé une solution de contournement à ma propre question. Vous pouvez supprimer l'belongsTo = [parent: Catégorie], en le remplaçant par une variable d'instance simple. Cela arrête subCategory.delete() de cascade vers le parent.

class Category { 
    String name 
    Category parent 

    static mapping = { 
     cache true 
     name index:'category_name_idx' 
    } 

    static constraints = { 
     parent(nullable:true) 
    } 
} 
+0

Dans mon équipe, nous résolvons ce problème de la même manière. Nous incluons également un objet transitoire "childrenCategories" pour obtenir les catégories enfants –

+1

Ouais, j'ai aussi ajouté un childCategories. Et pour supprimer les enfants lorsque le parent est supprimé, j'ai implémenté l'événement GORM 'beforeDelete': def beforeDelete = {Category.withNewSession {childrenCategories * .delete()}} –

+0

Merci pour le conseil. Si je le sais plus tôt, je n'aurais pas à implémenter la fonction de suppression :) –

Questions connexes