【发布时间】:2015-09-18 22:16:10
【问题描述】:
考虑以下领域类
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 中有一个标志,指示它是否是首选。但是,通过从 Person 直接引用他的首选 EmailAddress,我可以保证在任何给定时间只有一个 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 );
我认为由于从 defaultEmailAddress 到 Person 的反向引用,我得到了 TransientPropertyValueException,在构造 Person grails 时会自动定义 person.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 的错误吗?请帮忙。
【问题讨论】:
标签: hibernate grails grails-orm one-to-many grails-domain-class