2015-09-18 19 views
0

考虑以下域类如何在Grails中一对多地定义一个优先的(在主,默认情况下)子对象?

class Person { 

    String fullName 

    static hasMany = [ 
      emails: EmailAddress 
    ] 

    EmailAddress defaultEmailAddress 
} 

及其相应

class EmailAddress { 

    String email 

    static belongsTo = [person: Person] 

    static constraints = { 
     email(unique:true, email:true) 
    } 
} 

在我看来,这是为特定人设定他的首选EmailAddress的最好的方式。另一个明显的选择是在EmailAddress中有一个标志,指出它是否是首选的标志。但是,通过从个人直接引用他的预设EmailAddress,我可以保证在任何给定时间只有一个电子邮件地址是首选电子邮件地址,再加上我认为它表现更好。

问题是我不断收到TransientPropertyValueException由于此defaultEmailAddress,如果我删除此属性,然后它运行得很好。

这里是我的设置并保存新的Person对象

/* 
    Comes from a submitted form containing (I can't use less than and greater than in SO so I used parenthesis...). 
    (input type="text" name="fullName" value="Full Name" /) 
    (input type="text" name="emails[0].email" value="[email protected]" /) 
*/ 
Person person = new Person(params); 
person.defaultEmailAddress = person.emails[0]; 
person.save(flush:true); 

我觉得我得到一个TransientPropertyValueException由于从defaultEmailAddress到人逆向引用代码,构建人的Grails时自动定义的人反向引用.emails [0],但是当我明确地设置

person.defaultEmailAddress = person.emails[0]; 

那么它只是没有适用于反向引用,并给了我下面的输出:

2015-09-18 18:54:36,858 [http-bio-8080-exec-8] ERROR errors.GrailsExceptionResolver - TransientPropertyValueException occurred when processing request 
Not-null property references a transient value - transient instance must be saved before current operation : sos.Person.defaultEmailAddress -> sos.EmailAddress. Stacktrace follows: 
Message: Not-null property references a transient value - transient instance must be saved before current operation : sos.Person.defaultEmailAddress -> sos.EmailAddress 

我做错了什么?这是Hibernate的一个bug吗?请帮助。

回答

0

我定义为defaultEmailAddress hasOne(见ref-doc):

static hasOne = [ defaultEmailAddress:EmailAddress ] 
相关问题