2016-01-22 44 views
0

我有兩個具有一對一和一對多關係的對象。Gorm一對一和一對多

class GroupMember { 
    /** 
    * InvitationCode used to join this Group 
    */ 
    InvitationCode invitationCode 

    static constraints = { 
     // group creator member object won't have used an invitation code 
     invitationCode(nullable: true) 
    } 
} 

class InvitationCode { 
    /** 
    * GroupMember who created the code, not used the code 
    */ 
    GroupMember creator 

    // I tried removing this, it has no effect. 
    static hasMany = [members: GroupMember] 
} 

基本上,我有一個GroupMember誰擁有一個InvitationCode並且可以使用另一個InvitationCode。或者,一個InvitationCode只能屬於對/被創建,通過一個GroupMember,但也可以使用/引用許多GroupMember

的表格看起來像他們建立正確的 - 這兩個表有字段其他: INVITATION_CODE.CREATOR_IDGROUP_MEMBER.INVITATION_CODE_ID

然而,當我創建一個新的InvitationCode似乎GroupMember對象被更新,invitationCodeId被設置爲新創建的InvitationCodeid

GroupMember creator = new GroupMember(
    invitationCode: null // group creator - didn't use an invitation code 
) 
creator.save(flush: true) 

InvitationCode invitationCode = new InvitationCode(
    creator: creator 
) 
invitationCode.save(flush: true) 

GroupMember _creatorMember = GroupMember.findById(creator.id) 
assert _creatorMember.invitationCode == invitationCode // true?? 

我從來沒有設置creator.invitationCode所以我不知道如何/爲什麼是格姆設置它。我也不確定我的錯誤在定義域名的位置。當我刪除flush: true的時候,我在GroupMember.invitationCode上得到了外鍵約束違規。

回答

1

與當前設置的問題是,所述InvitationCode域具有2個引用到GroupMember域和Grails已經錯誤地推斷出(你的情況)是:

  • invitationCodecreator具有彼此雙向關聯
  • members是一個單向關聯到GroupMember

但在現實中,你はNT:

  • creator是一個單向關聯到GroupMember
  • members是一個多到一個關係到背參考invitationCode,使其成爲一個雙向關聯

理解,Grails有一個問題「猜測」如何形成這種複雜的關係。

關鍵是要使用mappedBy屬性。我已經成功地在相同的兩個類中映射了2個多對多關係,但沒有像您需要的那樣。我認爲你所需要的是有這個在你InvitationCode類:

static mappedBy = [ 
    members: 'invitationCode', 
    creator: 'none' // because the relationship is unidirectional 
] 

希望這對你的作品!

+0

它看起來像是在工作,我根本不需要包含成員,只是'creator:'none''完成了這個訣竅。謝謝! – Townsfolk