2013-05-09 28 views
0

我想要一个孩子添加到两个不同的父类,这样的:Grails的一对一的两个域对象

第一:

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 

我该怎么做?有没有更好的方法来做到这一点?

UPDATE:

我发现这个

Saving associated domain classes in Grails

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

+0

其中是'成员'中定义的组? – 2013-05-09 09:50:26

+0

对不起,我输入我的问题时出错。现在它已经得到纠正,多亏了指出它! – Thermech 2013-05-09 09:52:42

+0

你在冲洗吗? '.save(flush:true)' – 2013-05-10 13:52:20

回答

0

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

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

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

这样,级联行为就工作得很好!

0

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

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

+0

在我的真实代码中,Group被命名为否则:) – Thermech 2013-05-09 14:28:11