【问题标题】:How to define a preffered (in the sense of main, default) child object in a one to many in Grails?如何在 Grails 中以一对多的方式定义首选(主要,默认)子对象?
【发布时间】: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


    【解决方案1】:

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

    static hasOne = [ defaultEmailAddress:EmailAddress ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      • 2013-08-10
      • 2023-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多