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

Posted

技术标签:

【中文标题】如何从 Grails 控制器和视图外部引用 Grails 域类字段?【英文标题】:How to reference a Grails domain class fields from outside of the Grails controller and view? 【发布时间】:2010-09-28 15:26:33 【问题描述】:

我有域类:

class Child 
    static hasMany = [ toys : Toy ]
    String name
    Set  toys

class Toy 
    static belongsTo = [ owner : Child ]
    String name

在我的 JSP 中,我通过以下方式引用了一个孩子:

child = Child.findByName("Joe")

child = Child.findById(123)

但是当我尝试访问它的字段时:

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) 运行时也会出现此行为

【问题讨论】:

【参考方案1】:

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

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

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

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

干杯

【讨论】:

它来自一个 JSP。我正在改造一个从视图中查询的遗留应用程序。我应该将其更改为遵循 Spring/Grails 的 MVC 模式。 我尝试将 fetch 设置为 Eager,但现在 Toys 缺少大部分内容。换句话说,如果我不指定 fetch eager,所有的玩具都会被加载。如果我指定 fetch eager,那么只有 10-20% 的玩具被加载。 这很奇怪。我在 JIRA (GRAILS-3712) 中看到了这个问题。作为最后的解决方法,您可以将视图中使用的集合定义为默认急切获取: //(在域类中)静态映射 Toys lazy: false 现在应该可以解决问题了。

以上是关于如何从 Grails 控制器和视图外部引用 Grails 域类字段?的主要内容,如果未能解决你的问题,请参考以下文章

Groovy/grails 如何使用 jquery 从视图中调用控制器方法

iOS - 从外部类引用活动故事板视图控制器

如何从 gsp 调用 Grails 服务?

如何创建不同名称的控制器和视图 Grails 脚手架

如何在不在 grails 中生成视图的情况下调用动作 [关闭]

从 Grails 应用程序外部插入数据时,Grails 如何设置 _idx 字段?