2010-10-09 4 views
0

je les domaines suivantsm à Suppression m essaie aussi de supprimer une cascade-2-one

class Committee { 
    String name 
    BoardCommitteeType boardCommitteeType 
    Date dateCreated 
    Date lastUpdated 
    User createdBy 
    User modifiedBy 

    static belongsTo = [ 
     board: Board, 
    ] 

    static hasMany = [   
     members: User 
    ] 
} 

class User { 

    static hasMany = [    
     committees: Committee,  
    ] 

    static belongsTo = [ 
     Board, Committee 
    ] 
} 

Le problème est que lorsque je tente de faire un board.removeFromCommittees (comité) I Obtient l'exception suivante:

objet supprimé serait ré-enregistré par cascade (supprimer l'objet supprimé des associations): [com.wbr.highbar.User # 1];

Je comprends ce que cela signifie. Ce que je ne comprends pas, c'est pourquoi je l'obtiens. L'autre bit intéressant est que si je crée creatdBy et modifiedBy dans l'instance de comité null, la suppression fonctionne correctement. C'est pourquoi je pense que GORM essaie de cascader le one-2-one. Ma théorie est que cela a quelque chose à voir avec le fait que l'utilisateur appartient à un comité. Mais je ne sais pas comment résoudre le problème.

+0

Cette approche est criblée de dépendances circulaires et c'est ce qui cause les problèmes. Réfléchissez si vous pouvez refactoriser votre modèle de domaine. – mfloryan

+0

Pouvez-vous être plus précis quant à la façon dont les dépendances circulaires sont la cause de mon problème? – Gregg

Répondre

0

La suppression en cascade est effectuée par les relations belongsTo entre vos classes de domaine.

Depuis Committee belongsTo Board, lorsqu'un tableau est supprimé, la suppression est répercutée au comité. Depuis User belongsTo Committee, lorsqu'un Comité est supprimé, la suppression cascade vers l'Utilisateur.

La solution à votre problème consiste à supprimer la relation User belongsTo Committee.

Notes sur votre modèle de domaine dans son ensemble:

Vous avez beaucoup de plusieurs à plusieurs. Ils ne sont pas nécessairement faux, mais ils peuvent compliquer les choses. Vous pourriez probablement partir avec juste en utilisant:

class Committee { 
    static hasMany = [boards: Board, users: User] 
} 

class Board { 
    static hasMany = [users: User] 
    static belongsTo = Committee // this is the only belongsTo you need, since if a 
           // committee is dissolved, presumably the board 
           // will be dissolved as well (unless you have 
           // cross-committee boards) 
} 

class User { 
    // doesn't define any relationships, 
    // let the Committee/Board domains handle everything 

    // also, this is presuming that users are at a higher level than committees, i.e. 
    // a user could belong to multiple committees 
} 
+0

Si je supprime le comité User belongsTo, Grails se plaint que je n'ai aucun côté propriétaire de la relation M2M. Cela ne résout donc pas mon problème. Ce que j'ai fait pour résoudre ceci est que j'ai complètement supprimé le M2M et écrit une classe CommitteeMembers avec un ID composé de user.id et committee.id. Pour moi, c'est une limitation de la façon dont GORM implémente le M2M parce qu'il y a rarement un côté «propriétaire». – Gregg

+0

J'apprécie cependant l'aide. – Gregg

+0

Les relations GORM et M2M sont toujours un peu difficiles, et j'ai été dans des situations similaires à vous. Avez-vous essayé ma suggestion pour un autre modèle de domaine? Cela supprimerait le M2M et ne vous demanderait pas non plus d'écrire manuellement le domaine de relation. –