2008-12-28 12 views
3

Je les classes de domaine:Comment référencer un champs de classe de domaine Grails depuis l'extérieur du contrôleur Grails et afficher?

class Child { 
    static hasMany = [ toys : Toy ] 
    String name 
    Set toys 
} 
class Toy { 
    static belongsTo = [ owner : Child ] 
    String name 
} 

Dans mon JSP je référence à un enfant par:

child = Child.findByName("Joe") 

ou

child = Child.findById(123) 

Mais lorsque je tente d'accéder à ses champs:

child.getToys() 

Je reçois l'erreur:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: Child.toys, no session or session was closed 

Ai-je besoin de démarrer manuellement la session Mise en veille prolongée? Si oui, comment ferais-je cela?

Suivi février 2012: Ce comportement est également présent lors de l'exécution de la console Grails (Grails 2.0.0)

Répondre

8

Cela concerne une faille dans Grails 1.0.4 concernant Lazy hiberne à l'initialisation. Pour contourner ce problème, vous pouvez forcer fetching désireux de ces propriétés:

child = Child.findByName("Joe", [ fetch: [ toys: 'eager' ] ]) 

En dehors de cela, en suivant les principes MVC, vous devriez envisager d'effectuer ces requêtes à l'intérieur du contrôleur et de faire la partie des résultats du modèle.

Btw. faites-vous vraiment cela dans un JSP? Ou est un GSP?

À la vôtre

+0

C'est à partir d'un JSP. Je rééquipe une application héritée qui interroge à partir de la vue. Je devrais juste le changer pour suivre le modèle MVC de Spring/Grails. –

+0

J'ai essayé de mettre la recherche à l'épreuve, mais il manque maintenant beaucoup de contenu à ses jouets. En d'autres termes, si je ne spécifie pas aller chercher, tous les jouets sont chargés. Si je spécifie aller chercher, alors seulement 10-20% des jouets sont chargés. –

+1

C'est bizarre. J'ai vu le problème dans le JIRA (GRAILS-3712). Pour contourner le problème final, vous pouvez définir les collections que vous utilisez dans les vues à avidement récupérées par défaut: // (dans la classe de domaine) cartographie statique { jouets paresseux: false } Cela devrait résoudre le problème pour l'instant . –