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

Grails 如何在不使用映射的情况下加载任何属性';lazy:false';圣杯,grails,hibernate-mapping,Grails,Hibernate Mapping,当我需要比较和操作引用其他对象的对象时,经常遇到问题。例如: Class Student { ... String Name Integer Age ... } Class Stuff { ... Student student ... } 当我调用Stuff的一个实例(Stuff.get(id)/load(id))并访问我在调试模式下看到的名称、年龄和其他属性(Stuff.Name=null)时,它们就像“null”,尽管它们不是null。它 分析值时的命令​​这些属性中的 .name==

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

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

Class Stuff {
...
Student student
...
}
当我调用Stuff的一个实例(
Stuff.get(id)/load(id)
)并访问我在调试模式下看到的名称、年龄和其他属性(Stuff.Name=null)时,它们就像“null”,尽管它们不是null。它 分析值时的命令​​这些属性中的 .name==“笔”)发生错误

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

我读到一些关于配置Stuff映射中包含的内容“
student lazy:false
”,对于加载Stuff实例所需的所有时间,还需要向学生收费,但这除了会导致内存过载之外(因为Stuff是一个很好的域)解决这个问题的唯一方法是将所有引用都设置为“lazy:false”,这将减慢应用程序的速度,只是为了进行简单的比较

是否有人知道如何调用实例(Stuff),自动调用要工作的属性(student),只是为了比较数据,而不使用始终调用数据的“
student lazy:false


使用Grails 2.2.0 e o Groovy 2

Stuff
没有名为
name
的属性,因此调用
Stuff.name
时应该会得到
MissingPropertyException
。这与懒惰或渴望的关系无关

您可以检查惰性关系的定义,也可以检查

要访问name属性,您需要先访问student属性,然后才能执行以下操作:

Stuff instance = Stuff.get(id)
println instance.student.name //this, if lazy, will trigger a new database query.
如果您知道您的代码将通过与可以在一次数据库访问中获取的内容的关系来访问Student实例(渴望而非懒惰):


理解Grails中Hibernate的行为是很困难的。这个命令解决了这个问题。非常感谢。Grails没有义务让您了解Hibernate,但是根据您所做的工作,了解这些知识是很好的:-)
Stuff instance = Stuff.withCriteria {
  eq('id', id)
  fetchMode("student", FetchMode.JOIN)
}