2010-07-20 4 views
1

Je les éléments suivants 3 classesGrails Supprimer et Cascading

class User { 
static hasMany = [coupons: Coupon] 
} 

class Coupon { 
static belongsTo = [affiliate: Affiliate] 
} 

class Affiliate { 
static hasMany = [coupons: Coupon] 
} 

Comment puis-je en cascade de configuration afin que je puisse supprimer un coupon spécifique et seront retirés des listes d'affiliation et l'utilisateur. Je reçois toujours "Impossible de supprimer ou mettre à jour une ligne parente"

Ai-je raté quelque chose?

Répondre

4

Vous devez supprimer le coupon des collections parentes. Vous pouvez soit le faire manuellement dans le service où vous supprimez le coupon, soit vous pouvez utiliser les événements de mise en veille prolongée des utilisateurs pour le faire. Je ne pense pas que vous pouvez avoir une cascade à faire. Le plus proche que vous pouvez obtenir est 'delete-orphelin', mais vous avez encore besoin de rompre l'association pour que cela fonctionne.

Voir la section 5.5.1 du manuel.

http://grails.org/doc/latest/

Fondamentalement, vous pouvez ajouter une méthode « beforeDelete » à votre classe de coupon qui supprime la référence de ses parents. Graisses est assez intelligent pour déclencher la méthode beforeDelete, vous l'avez deviné, avant que le coupon ne soit supprimé. C'est un bon endroit pour casser les associations. Que vous le fassiez manuellement dans une classe de service ou de domaine, ou que vous utilisiez des événements Hibernate, le code sera presque le même. Assurez-vous que vous écrivez un test d'intégration pour elle ...

2

essayez d'ajouter ceci dans l'utilisateur

static mapping = { 
    cupons cascade: "all-delete-orphan" 
} 
+0

Cela fonctionne. J'ai testé cela aussi en utilisant 'Test.executeUpdate (" supprimer du domaine où id = 123 "' mais il ne cascade pas la suppression des enfants. \ NIl donne ensuite une erreur 'viole la contrainte de la clé étrangère' .Pour cela vous devez faire' row. delete() 'sur chaque ligne. – Guus