如何摆脱与Wicket JPA/Hibernate集成的LazyInitializationException(使用Spring)

ber*_*ert 7 spring wicket hibernate jpa

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

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

我真的不想走DTO/VO的道路,因为我认为它只会使代码变得臃肿,并且需要我编写大量的样板代码.

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

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

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

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

提前致谢

Pet*_*mas 6

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

构建智能EntityModel

FWIW我在PerfBench中使用自定义RequestCycle(如上面链接的注释部分所示)得到了非常好的结果,你可以在这里找到代码.IIRC这是一种简化的方法(OpenSessionInView/London Wicket),来自Bozho发布的链接.