可以隐式地将所有嵌套域对象重新附加到Grails中的Hibernate会话吗?

时间:2012-01-18 00:50:13

标签: hibernate session grails gorm httpsession

我注意到当从HttpSession中获取Domain对象并将其附加回hibernate会话时,它不附加任何属性的Domain类。

例如,假设Foo和Bar都是域类,而Foo是一个分离的Domain类,它有一个属性Bar,这会失败:

myFoo.attach()
println myFoo.bar.someBarProperty //LazyInitializationException

但这成功了

myFoo.attach()
myFoo.bar.attach()
println myFoo.bar.someBarProperty //Ok

是否存在避免上述内容的myFoo.attachRecursively()或类似内容?对于一个简单的情况,这不是什么大问题,但对于更大的对象图,它可能会很混乱。

注意我意识到为此目的使用HttpSession不是最佳实践,我只在非常具体的情况下通过flash范围使用它,所以请避免“只传递id并重新加载它”类型的答案:)

1 个答案:

答案 0 :(得分:2)

我建议您使用“myFoo.merge()”而不是“myFoo.attach()”,因为当同一个对象与其他会话相关联时那时你得到例外:

具有相同标识符值的不同对象已与会话错误[重复]

相关联

当你在那时使用merge()方法时,如果object是持久性的,那么它就使用了那个对象,如果对象不是持久性或者当时没有附加,它会为该特定对象创建新的持久性并使用它。

merge