【问题标题】:LazyInitializationException in GrailsGrails 中的 LazyInitializationException
【发布时间】:2013-06-05 07:30:53
【问题描述】:
Grails 2.2.1
我的简单域:
class Article{
SortedSet<Photo> photoGallery
//helper method
Photo getMainPhoto(){
Photo mainPhoto = photoGallery.find{it.mainPhoto}
return mainPhoto
}
}
一对多的相册是懒加载的
我从 .gsp 视图调用 getMainPhoto 方法。
问题是,有时(并非总是)我在尝试从惰性一对多照片库中获取主照片时收到 LazyInitializationException 错误。
为什么偶尔会发生这种情况,而不是每次我调用该方法时?这正常吗?我怎样才能解决这个问题,而不是急切地获取关系?
谢谢
【问题讨论】:
标签:
hibernate
grails
grails-orm
lazy-evaluation
eager
【解决方案1】:
不确定,但我曾经遇到过同样的错误,当我试图访问一个在 future 中有嵌套对象的对象时,所以有时在并发执行中由于懒惰,所有嵌套的域对象都不是在使用它们之前获取。
可以通过在视图上使用之前访问块上的相同属性来避免问题。
所以如果你在该行下方添加打印语句或其他内容
Photo mainPhoto = photoGallery.find{it.mainPhoto}
然后它应该被加载。
我不确定,但我想如果你这样添加:
Photo mainPhoto = photoGallery.find{it.mainPhoto}
println("mainPhoto=${mainPhoto}")
那么它应该呈现在 GSP 页面上。
【解决方案2】:
您提供的代码是您如何定义域类Article?你甚至可以使用SortedSet 之类的东西吗?如果您希望 Grails 正确处理所有事情,我认为您需要在所有一对多情况下使用 hasMany。
另一件可能有帮助的事情:看看Article 是否有一个自动生成的辅助方法,比如getPhotoGallery。也就是说,不要直接引用photoGallery。
如果有任何帮助,请告诉我们。我自己也很困惑。