代码之家  ›  专栏  ›  技术社区  ›  bert

如何通过wicket jpa/hibernate集成(与Spring)消除lazyinitializationException

  •  7
  • bert  · 技术社区  · 15 年前

    我正在开发一个应用程序,使用Wicket作为视图层,使用JPA(Hibernate)作为ORM。使用Wicket构建UI非常有趣(即使使用Ajax也是如此)。我的问题来自于集成编辑页上的持久对象(使用loadableDetachableModel时只读页没有问题)。

    我正在使用来自Spring的OSIV过滤器为视图提供一个开放的会话。但是,当我将域对象(@entity mapped classes)保存在编辑页面中时,当我在Ajax回调中访问它们的属性时,我会得到可怕的延迟加载过度。

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

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

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

    您建议什么交易管理?现在我在服务层使用@transaction。如果我使用其他方法访问存储休眠会话中的数据,这会发生什么变化?

    欢迎任何指针/链接,因为我在这里有点迷路了。

    提前谢谢

    4 回复  |  直到 12 年前
        1
  •  6
  •   Peter Thomas    15 年前

    这篇博文(涉及到LDM的细节)给了我一些很好的见解,特别是对于编辑场景:

    Building a smart EntityModel

    fwiw我使用自定义的请求周期(如上面链接的注释部分所建议的)在 PerfBench 你可以找到密码 here . IIRC这是一个简化的方法(opensessioninview/london wicket),来自bozho发布的链接。

        2
  •  3
  •   Bozho    15 年前

    This 是关于带Wicket的OpenSessionView的简短演示。

    如果使用得当,opensessioninview方法应该保证 LazyInitializationException 发生。

        3
  •  1
  •   user1652654 bert    12 年前

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

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

    我所要做的一切 添加 调用了detach()的标志 并在 getObject() 方法。如果旗子被设置,我会 EntityManager.merge() 并且有一个重新附加的模型,我可以在UI组件中使用。

    谢谢大家的意见

        4
  •  0
  •   slckin    15 年前

    如果使用不作为模型传递给组件的loadableDetachableModel,那么Wicket将不会对它们调用.detatch(),而且它们通常也没有序列化,因此它们将具有旧数据,并抛出惰性异常。

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