Hibernate 如何在Grails中的一对多中定义一个优先(主、默认)子对象?

Hibernate 如何在Grails中的一对多中定义一个优先(主、默认)子对象?,hibernate,grails,gorm,one-to-many,grails-domain-class,Hibernate,Grails,Gorm,One To Many,Grails Domain Class,考虑以下域类 class Person { String fullName static hasMany = [ emails: EmailAddress ] EmailAddress defaultEmailAddress } 及其相应的 class EmailAddress { String email static belongsTo = [person: Person] static const

考虑以下域类

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中有一个标志,指示它是否是首选的。但是,通过让此人直接引用其预先提供的电子邮件地址,我可以保证在任何给定时间只有一个电子邮件地址是首选地址,而且我猜它的性能更好

问题是由于这个defaultEmailAddress,我一直在获取TransientPropertyValueException,如果我删除这个属性,它就会正常运行

下面是我设置和保存新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="test@email.com" /)
*/
Person person = new Person( params );
person.defaultEmailAddress = person.emails[0];
person.save( flush:true );
我认为在构造Person时,grails会自动定义Person.emails[0]的backreference,但当我显式设置

person.defaultEmailAddress = person.emails[0];
然后它就不适用于backreference,并提供以下输出:

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的错误吗?请帮助。

我将默认电子邮件地址定义为
hasOne
(请参阅):

static hasOne = [ defaultEmailAddress:EmailAddress ]