Hibernate 如何从Grails控制器和视图外部引用Grails域类字段?

Hibernate 如何从Grails控制器和视图外部引用Grails域类字段?,hibernate,grails,Hibernate,Grails,我有域类: class Child { static hasMany = [ toys : Toy ] String name Set toys } class Toy { static belongsTo = [ owner : Child ] String name } 在我的JSP中,我通过以下方式引用子对象: child = Child.findByName("Joe") 或 但当我尝试访问其字段时: child.getToys() 我得到

我有域类:

class Child {
    static hasMany = [ toys : Toy ]
    String name
    Set  toys
}
class Toy {
    static belongsTo = [ owner : Child ]
    String name
}
在我的JSP中,我通过以下方式引用子对象:

child = Child.findByName("Joe")

但当我尝试访问其字段时:

child.getToys()
我得到一个错误:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: Child.toys, no session or session was closed
我需要手动启动Hibernate会话吗?如果是这样,我该怎么做


2012年2月的后续行动:从Grails控制台(Grails 2.0.0)运行时也会出现此行为

这与Grails 1.0.4中有关Hibernates惰性初始化的缺陷有关。作为一种解决方法,您可以强制立即获取这些属性:

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

除此之外,遵循MVC原则,您应该考虑在控制器内部执行这些查询并将结果作为模型的一部分。

顺便说一句,你真的在JSP中这样做吗?还是普惠制


干杯

这是一个JSP。我正在改造一个从视图进行查询的遗留应用程序。我应该将其更改为遵循Spring/Grails的MVC模式。我尝试将fetch设置为eager,但现在toys缺少了它的大部分内容。换句话说,如果我不指定fetcheager,那么所有的玩具都已加载。如果我指定fetcheager,那么只有10-20%的玩具被加载。这很奇怪。我在JIRA(GRAILS-3712)中看到了这个问题。作为最后一种解决方法,您可以定义在视图中使用的集合,以便在默认情况下急切地获取://(在域类中)静态映射{toys lazy:false},这将暂时解决问题。
child = Child.findByName("Joe", [ fetch: [ toys: 'eager' ] ] )