代码之家  ›  专栏  ›  技术社区  ›  Townsfolk

戈尔一对一和一对多

  •  0
  • Townsfolk  · 技术社区  · 8 年前

    我有两个对象,它们有一对一和一对多的关系。

    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 并且可以使用另一个 邀请代码 。或者 邀请代码 只能属于/由一个 组成员 ,但可以被许多人使用/引用 组成员

    这些表看起来设置正确-两个表都有另一个表的字段: INVITATION_CODE.CREATOR_ID GROUP_MEMBER.INVITATION_CODE_ID .

    但是,当我创建新的 邀请代码 看起来 组成员 对象正在更新 invitationCodeId 正在设置为新创建的 邀请代码 id .

    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 所以我不确定GORM如何/为什么要设置它。我也不确定我在定义域时的错误在哪里。当我删除 flush: true 是不是我违反了外键限制 GroupMember.invitationCode .

    1 回复  |  直到 8 年前
        1
  •  1
  •   tylerwal    8 年前

    当前设置的问题是 InvitationCode 域有2个对 GroupMember domain和grails错误地推断(在您的情况下):

    • invitationCode creator 相互之间有双向联系
    • members 是与 组成员

    但实际上,你想要:

    • 造物主 组成员
    • 成员 与后台参考建立多对一关系 邀请代码 ,使其成为双向关联

    可以理解,grails在“猜测”如何形成这种复杂关系方面存在问题。

    关键是使用 mappedBy 所有物我已经成功地使用它在相同的2个类上映射了2个多对多关系,但并不像您需要的那样。我 认为 你需要的是把这个放在你的 邀请代码 类别:

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

    希望这对你有用!