7

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

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

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

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

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

你会建议什么交易管理?现在我在服务层使用@Transaction。如果我使用其他方式访问跨休眠会话存储数据,那将如何改变?

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

提前致谢

4

4 回答 4

6

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

构建智能实体模型

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

于 2010-01-18T15:31:56.377 回答
3

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

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

于 2010-01-18T11:33:05.167 回答
1

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

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

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

谢谢大家的意见

于 2010-04-29T07:01:13.753 回答
0

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

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

于 2010-02-26T19:43:37.477 回答