如何在不使用Grails中的映射'lazy:false'的情况下加载任何属性

时间:2014-02-20 16:49:36

标签: grails hibernate-mapping

当我需要比较和操作引用其他对象的对象时,一直遇到问题。例如:

Class Student {
...
String Name
Integer Age
...
}

Class Stuff {
...
Student student
...
}

当我调用Stuff实例(Stuff.get (id)/load(id))并将访问我在调试模式下看到的Name,Age和其他属性时(stuff .name = null,它们就像'null',尽管它们不是它。它 分析这些属性的值时的命令(东西 .name ==“pen”)错误发生。

我需要调用实例并比较它们的值来执行业务规则,但不知道如何解决这个问题。

我读了一些关于在配置Stuff Mapping'student lazy: false'中包含你需要加载实例的所有时间的东西,也给学生收费,但除了重载内存之外(因为东西是一个领域伟大)将解决这个案例是唯一的解决方案,将所有引用放在'懒惰:假',这将减慢应用程序只是为了进行简单的比较。

有没有人知道如何调用实例(Stuff),自动调用属性工作(学生)只是为了进行数据比较,而不使用始终调用数据的“student lazy: false”? ...

使用Grails 2.2.0 e o Groovy 2

1 个答案:

答案 0 :(得分:1)

Stuff没有名为name的媒体资源,因此您应该MissingPropertyException拨打stuff.name。这与懒惰或渴望的关系无关。

您可以查看懒惰关系的定义in the documentation以及the difference between the types of fetch

要访问name属性,您需要先访问student属性:

Stuff instance = Stuff.get(id)
println instance.student.name //this, if lazy, will trigger a new database query.

如果您知道您的代码将通过与Stuff的关系访问Student实例,那么您可以在一个数据库访问中获取两者(渴望而不是懒惰):

Stuff instance = Stuff.withCriteria {
  eq('id', id)
  fetchMode("student", FetchMode.JOIN)
}