【问题标题】:How to get rid of LazyInitializationException with Wicket JPA/Hibernate integration (with Spring)如何通过 Wicket JPA/Hibernate 集成(使用 Spring)摆脱 LazyInitializationException
【发布时间】:2010-01-18 11:27:09
【问题描述】:

我正在开发一个使用 Wicket 作为视图层和 JPA(Hibernate) 作为 ORM 的应用程序。使用 Wicket 构建 UI 很有趣(即使使用 ajax)。我的问题来自于在编辑页面上集成持久对象(只读页面使用 LoadadableDetachableModel 没有问题)。

我正在使用 Spring 的 OSIV 过滤器为视图提供一个开放会话。但是,当我在编辑页面中保留域对象(@Entity 映射类)时,当我在 ajax 回调中访问它们的属性时,我得到了可怕的延迟加载异常。

我真的不想走 DTO / VO 这条路,因为我认为它只会使代码膨胀并且需要我编写大量样板代码。

一个想法是使用视图中的模型对象,将传入的对象与当前的休眠会话合并,并访问所有 getter 以完全初始化对象。在此之后,对象将被存储在视图(seesion)中并被分离。保存后,我会重新合并它并提交更改。

这是推荐的方式吗?有更好的解决方案吗?奇怪的是,大多数书籍/博客/howtos 完全忽略了这个问题。

您会建议哪种事务管理?现在我在服务层使用@Transaction。如果我使用其他方式访问跨休眠会话存储数据,这将如何改变?

欢迎任何指针/链接,因为我有点迷失在这里..

提前致谢

【问题讨论】:

  • 我编辑了你的问题标题,以便它反映真正的问题
  • 感谢您的链接。我开始挖掘源代码/javadoc。到目前为止看起来很棒。我什至知道 WicketRAD,但当我想到这个问题时,它不知怎的逃过了我的视线。

标签: hibernate spring jpa wicket


【解决方案1】:

这篇博文(详细介绍了 LDM)给了我一些很好的见解,尤其是对于编辑场景:

Building a smart EntityModel

FWIW 我在PerfBench 中使用自定义RequestCycle(如上面链接的cmets 部分中所建议的)获得了非常好的结果,您可以找到代码here。 IIRC 这是 Bozho 发布的链接中方法(OpenSessionInView / London Wicket)的简化。

【讨论】:

    【解决方案2】:

    This 是关于使用 Wicket 的 OpenSessionInView 的简短演示。

    如果使用得当,OpenSessionInView 方法应该保证不会出现LazyInitializationException

    【讨论】:

      【解决方案3】:

      我终于有时间再次解决这个问题了。不知道我怎么会错过简单的解决方案;)

      我们开发了自己的 UIFormModel Wickets IModel 接口实现。因为我想在 http 请求期间保持用户输入,所以我在 detach() 调用中什么也没做,保持(和序列化)模型对象处于完整状态。

      我只需要添加就是调用 detach() 的标志,并在 getObject() 方法中检查该标志。如果设置了标志,我会执行 EntityManager.merge() 并重新连接模型,我可以在 UI 组件中使用它。

      感谢大家的参与

      【讨论】:

        【解决方案4】:

        如果你使用 LoadadableDetachableModel 的,你没有作为模型传递给组件,那么 wicket 不会在它们上调用 .detatch() ,而且它们通常也没有序列化,所以它们会有旧数据,并抛出惰性例外。

        确保始终将 LDM 传递给组件,或自行分离它们。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-05-03
          • 1970-01-01
          • 2010-10-09
          • 2017-05-10
          • 2011-07-22
          • 2014-07-11
          • 2015-07-31
          相关资源
          最近更新 更多