2010-10-26 18 views
1

cela a été me tracasse,Grails unidirectionnelle un à plusieurs

permet de dire que j'ai deux modèles, la catégorie et produit

class Category { 
    static hasMany = [products : Product] 
    String name 
} 
.. 
class Product { 
    String name 
} 

maintenant, je veux supprimer le produit, ce qui arrive à exister dans beaucoup de catégorie. Je suis venu avec ces lignes dans mon produit des méthodes beforeDelete

def beforeDelete = { 
    Category.list()?.each{ 
     it.removeFromProducts(this) 
    } 
} 

maintenant cela peut fonctionne, mais la façon dont je le vois, thats un bon nombre de requête pour une tâche simple. Je sais que je peux obtenir le même résultat avec une seule ligne de chaîne SQL ("delete from category_product where product_id =?"). mais je suis juste curieux, y at-il un moyen plus sophistiqué pour y parvenir en grails? (En plus de l'exécution de la chaîne sql)

Répondre

1

Vous pouvez ajouter les lignes suivantes à la catégorie classe

static mapping = { 
    products cascade: "all-delete-orphan" 
} 

et appeler delete sur place Catégorie. Pourquoi utilisez-vous une relation unidirectionnelle dans ce cas? Ne serait-ce pas mieux avec un système bidirectionnel? Dans le cas ci-dessus, vous parcourez toutes les catégories chaque fois que vous supprimez un produit qui est une opération lourde de ressources (selon vos nombreuses catégories bien sûr), la meilleure solution serait de trouver la catégorie via une relation bidirectionnelle comme celle-ci. :

class Product { 
    String name 
    static belongsTo = [category: Category] 
} 

C'est que vous pouvez facilement accéder à la catégorie du produit et le supprimer.

Voir this blog post pour plus de conseils et astuces.