Grails在两个域对象上一对一

时间:2013-05-09 09:45:49

标签: grails grails-2.2

我想将一个孩子添加到两个不同的父类中,如:

首先:

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

孩子就像那样定义

  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

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

2 个答案:

答案 0 :(得分:0)

我复制了你的例子(略微修改了将组表名改为非保留字),并且级联使用grails 2.2.1正常工作。 MemberGroup都将其保存级联到新创建的Profiles

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

答案 1 :(得分:0)

我找到了一个很好的解决方案。最好的方法是在子节点中定义父节点但可以为空。像那样:

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

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

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