2015-09-18 3 views
0

Tenir compte de la classe de domaine suivantComment définir un objet enfant preffered (au sens de principal, par défaut) dans un un à plusieurs dans Grails?

class Person { 

    String fullName 

    static hasMany = [ 
      emails: EmailAddress 
    ] 

    EmailAddress defaultEmailAddress 
} 

et son correspondant

class EmailAddress { 

    String email 

    static belongsTo = [person: Person] 

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

Il me semble que ce soit la meilleure façon pour une personne donnée pour définir son EmailAddress préféré. L'autre option évidente est d'avoir un drapeau dans EmailAddress indiquant s'il est le préféré. Mais, en ayant une référence directe de la Personne à son EmailAddress préféré, je peux garantir qu'une seule EmailAddress soit la préférée à tout moment, et je suppose qu'elle fonctionne mieux. Le problème est que je continue d'obtenir TransientPropertyValueException en raison de cette adresseEmail par défaut, si je supprime cette propriété, elle s'exécute correctement.

Voici mon code pour la mise en place et l'enregistrement d'un nouvel objet Personne

/* 
    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); 

Je pense que je reçois un TransientPropertyValueException en raison de la backreference de defaultEmailAddress à personne, lors de la construction la personne Grails définit automatiquement le backreference pour personne .emails [0], mais quand je explicitement mis

person.defaultEmailAddress = person.emails[0]; 

il fonctionne, tout simplement pas le backreference et me donne le résultat suivant:

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 

Est-ce que je fais quelque chose de mal? Est-ce un bug avec Hibernate? Aidez-moi, s'il vous plaît.

Répondre

0

Je définis le defaultEmailAddress comme hasOne (voir ref-doc):

static hasOne = [ defaultEmailAddress:EmailAddress ]