【问题标题】:Grails one to one on two domain objectGrails 一对一的两个域对象
【发布时间】:2013-05-03 18:09:54
【问题描述】:

我想将一个孩子添加到两个不同的父类中,就像这样:

第一:

class Member {
    Profile profile

    Member() {
        this.profile = new Profile()
    }

    static mapping = {
        profile cascade: 'all-delete-orphan'
    }
}

第二:

class Team {
    Profile profile

    Team() {
        this.profile = new Profile()
    }

    static mapping = {
        profile cascade: 'all-delete-orphan'
    }
}

thw child 就是这样定义的

  class Profile() {
  }

问题是我救了父母,却没有救孩子:

Member member = new Member().save(flush: true, failOnError: true)

assert !member.hasErrors()
assert member.profile           
assert !member.profile.hasErrors()

assert member.profile.id //FAIL

我做错了什么?有没有更好的方法?

更新:

我找到了这个

Saving associated domain classes in Grails

这种行为似乎需要“属于”。但是为什么'级联:'all-delete-orphan'不强制这样做?因为在那种特定情况下我不能使用“属于”

【问题讨论】:

  • groupMember 中定义在哪里?
  • 抱歉,我在输入问题时出错了。现已更正,感谢指出!
  • 你在冲洗吗? .save(flush: true)
  • 是的,在单元测试中 session.flush 有问题。

标签: grails grails-2.2


【解决方案1】:

我找到了一个不错的解决方案。最好的方法是在孩子中定义两个父母,但可以为空。像这样:

class Profile() {
    static belongsTo = [member: Member, team: Team]

    static constraints = {
        member nullable: true
        team nullable: true
    }
}

这样,级联行为就可以正常工作了!

【讨论】:

    【解决方案2】:

    我复制了您的示例(稍作修改以将组表名称更改为非保留字)并且级联使用 grails 2.2.1 正常工作。 MemberGroup 都将它们的保存级联到新创建的 Profiles

    假设您的类比这更复杂,您的类中的其他地方可能会出现错误(例如,constraints 中描述的级联行为而不是 mapping 等)。

    【讨论】:

      猜你喜欢
      • 2013-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      • 1970-01-01
      相关资源
      最近更新 更多