Grails中的LazyInitializationException

时间:2013-06-05 07:30:54

标签: hibernate grails gorm lazy-evaluation eager

Grails 2.2.1

我的简单域名:

class Article{
    SortedSet<Photo> photoGallery

    //helper method
    Photo getMainPhoto(){
        Photo mainPhoto = photoGallery.find{it.mainPhoto}
        return mainPhoto
    }
}

懒散地获取一对多照片库

我从.gsp视图调用getMainPhoto方法。 问题是有时(并非总是)在尝试从懒惰的一对多照片库中获取主照片时出现LazyInitializationException错误。

为什么偶尔会发生这种情况而不是每次调用该方法?这是正常的吗?我怎么能解决这个问题,而不是急切地想要这种关系呢?

由于

2 个答案:

答案 0 :(得分:0)

不确定,但我曾经遇到同样的错误,当我试图访问一个在未来有嵌套对象的对象时,所以有时在由于懒惰的并发执行中,所有嵌套的域对象都没有在使用它们之前获取。

在视图上使用它之前,可以通过访问块上的相同属性来避免

问题。

所以如果你在行

下面添加一个print语句
Photo mainPhoto = photoGallery.find{it.mainPhoto}

那么它应该被加载。

我不确定,但我想如果你这样添加它:

Photo mainPhoto = photoGallery.find{it.mainPhoto}
println("mainPhoto=${mainPhoto}")

然后它应该在GSP页面上呈现。

答案 1 :(得分:0)

您提供的代码是您定义域类Article的方式吗?你甚至可以使用像SortedSet这样的东西吗?如果您希望Grails正确处理所有事情,我认为您需要在所有一对多情况下使用hasMany

另一件可能有用的事情是:Article是否有自动生成的辅助方法,如getPhotoGallery。也就是说,不要直接引用photoGallery

如果有任何帮助,请告诉我们。我很困惑。