2010-07-16 7 views
2

Je suis bloqué par ce problème. Le code me semble ok à (évidemment je manque quelque chose. La question est ce qu'elle est?)Comportement en cascade de Grails

J'ai une classe de projet

def class project{ 
    ... 
    Manager manager 
} 

C'est de définition classe Personne et Gestionnaire

def class Person{ 
    String firstName 
    String lastName 
} 

def class Manager extends Person{ 
    static hasMany = [ projects: Project] 

} 

La relation est simple - Un projet a un gestionnaire et un gestionnaire a de nombreux projets. Pour autant que je sache, dans la relation un-à-plusieurs, la sauvegarde cascade parce qu'elle est bi-directionnelle de un à plusieurs. Mais quand je fais

Project project = new Project() 
Manager mgr = new Manager(...) 
project.manager = mgr 
project.save() 

Je reçois l'erreur suivante provoquée par: org.hibernate.TransientObjectException: objet référence une instance transitoire non enregistré - enregistrer l'instance transitoire avant le rinçage: Directeur

et quand je fais ce

Project project = new Project() 
Manager mgr = new Manager(...) 
project.manager = mgr 
project?.manager.save() 
project.save() 

Cela fonctionne très bien. Mais je pense que le projet? .manger.save() ne devrait pas être nécessaire !!

Répondre

2

Une solution rapide serait de sauvegarder le gestionnaire avant d'enregistrer le projet.

Vous n'avez également pas de configuration belongsTo. Consultez le chapitre 5 de la documentation sur les grails.

http://grails.org/doc/latest/

« Dans le cas d'un à plusieurs bidirectionnelle où les nombreux côté ne définit pas belongsTo alors la stratégie en cascade est réglée sur « SAVE-UPDATE » pour un côté et « aucun » pour les nombreux côtés. "

Donc, si je reçois correctement, vous pouvez appeler économiser sur l'mgr (d'un côté), mais pas d'économiser sur le côté du projet (pour obtenir en cascade au travail)

Dans le cas d'un de un bidirectionnel à-beaucoup où le côté de plusieurs définit un appartient alors la stratégie de cascade est placée à «TOUS» pour un côté et «AUCUN» pour le côté de plusieurs.

Vous voudrez également vérifier la section 5.5.2.9, où vous pouvez spécifier un comportement en cascade personnalisé.

+0

Merci pour votre réponse. Oui, le gestionnaire d'épargne fait d'abord le tour. Mais belongsTo n'aide pas. Quelle est la bonne façon de le faire? i) Retirer le gestionnaire de gestionnaire et avoir juste static belongsTo = [manager: Manager] ou static belongsTo = Manager ii) Garder le gestionnaire de gestionnaire et avoir static belongsTo = [manager: Manager] ou static belongsTo = Gestionnaire. BTW, j'ai essayé les deux et ça ne fonctionne pas. Pour l'instant, la solution rapide fonctionne – Paras

+0

hmm Je pense que la bonne façon est de sauver le côté. "Dans le cas d'un un-à-plusieurs bidirectionnel où le côté plusieurs définit un appartient alors la stratégie de cascade est définie sur" ALL "pour un côté et" NONE "pour le côté plusieurs." Même avec l'appartTo, la cascade est AUCUN pour tous les côtés. Sauver le premier côté ne fonctionnera pas si le côté n'est pas encore persistant. Je pense que cela a du sens, car généralement, vous ajouteriez un gestionnaire au système, l'enregistreriez, puis ajouteriez des projets. Bien que je puisse voir le cas où vous feriez les deux dans le même but. – hvgotcodes

Questions connexes