2015-09-18 18 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 ] 
相關問題