【问题标题】:possible to implicitly re-attach all nested domain objects to Hibernate session in Grails?可以隐式地将所有嵌套的域对象重新附加到 Grails 中的 Hibernate 会话吗?
【发布时间】:2012-01-18 00:50:12
【问题描述】:

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

例如,假设 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 并重新加载”类型答案:)

【问题讨论】:

  • 对bar的引用有什么级联设置?
  • 好问题。就我而言, foo 属于 bar。也许这就是它不会隐式重新附加的原因。 static belongsTo = [bar: Bar]

标签: hibernate session grails grails-orm httpsession


【解决方案1】:

我建议您使用 "myFoo.merge()" 而不是 "myFoo.attach()" 因为当同一个对象与其他会话相关联时那时你会得到这样的异常:

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

当您使用 merge() 方法时,如果对象是持久性,则它使用该对象,如果对象不是持久性或当时未附加,它会为该特定对象创建新的持久性并使用它。

merge

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-13
    • 2011-02-13
    • 2011-11-23
    • 2012-01-03
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    相关资源
    最近更新 更多