2010-10-09 100 views
0

我有以下的域删除m比米还试图级联删除一个-2-酮

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 
    ] 
} 

的问题是,当我尝试做一个board.removeFromCommittees(委员会)我会得到以下例外:

删除的对象将通过级联重新保存(从关联中删除删除的对象):[com.wbr.highbar.User#1];

我明白这意味着什么。我不明白的是为什么我得到它。另一个有趣的地方是,如果我在委员会实例中使creatdBy和modifiedBy为null,那么删除工作就好了。这就是为什么我认为GORM正在尝试级联一对一。我的理论是,这与用户属于委员会的事实有关。但我不知道如何解决这个问题。

+0

这种方法充满了循环依赖关系,这就是导致问题的原因。考虑你是否可以重构你的领域模型。 – mfloryan 2010-10-09 19:04:27

+0

对于循环依赖是如何导致我的问题的,你能更具体一些吗? – Gregg 2010-10-09 19:30:13

回答

0

级联删除受到域类之间belongsTo关系的影响。

由于Committee belongsTo Board,董事会被删除时,删除级联到委员会。由于User belongsTo Committee,当委员会被删除时,删除级联到用户。

解决您的问题是删除User belongsTo Committee关系。

注上你的域模型作为一个整体:

你有很多很多一对多的关系。他们不一定是错的,但他们可能是过于复杂的事情。你可能只是在使用时逃脱:

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

如果我删除用户belongsTo委员会,Grails抱怨说我对M2M关系没有自己的一面。所以这并不能解决我的问题。我所做的解决这个问题的方法是我已经完全删除了M2M,并编写了一个具有user.id和committee.id的组合ID的CommitteeMembers类。对我来说,这是GORM如何实现M2M的限制,因为很少有“拥有”的一面。 – Gregg 2010-10-10 22:18:19

+0

但是我非常感谢帮助。 – Gregg 2010-10-10 22:19:21

+0

GORM和M2M的关系总是有点挑剔,我和你一直处于类似的情况。您是否尝试了一个替代域模型的建议?这将删除M2M并且不要求您手动编写关系域。 – 2010-10-11 03:07:13