OpenSessionInView vs PersistentContext(扩展)

时间:2012-08-15 16:25:27

标签: java jpa lazy-loading

我正在开发一个架构Hibernate / JPA / Spring / Zk,我现在将这些问题成倍增加,因为我必须学习很多框架。

我有一个问题让我困惑了好几天。

我听说“模式”OpenSessionInView使Hibernate事务保持活跃状态​​以进行延迟加载。 许多人还说模式不是很干净。

另一方面,据说PersistentContext扩展不是线程安全的,因此不适合保持entityManager的存活。

那么,这些问题的真正解决方案是什么? 我认为这些问题源于ajax的引入,它允许更多的可能性,特别是在必要时使用延迟加载来加载一些重的集合。

暂时,我在扩展模式下尝试了@PersistenceContext。它正在...... 我必须为我的JUnit测试设置它,以及它在我的Web应用程序中也工作,延迟加载而没有更多配置。

框架的演变(Spring,JPA 2.0)是否意味着现在使用PersistentContext更容易和更“干净”工作?

如果不是这种情况,我们是否应该使用Spring的OpenSessionInViewFilter并在事务模式下替换PersistentContext?

谢谢。

1 个答案:

答案 0 :(得分:1)

我听到了你的声音。自2008年以来,我已在多个应用程序中实现了这两种模式。现在,我完全放弃任何有条理的模式。当您向客户端引入状态时,会产生可伸缩性和状态管理问题:您是否在客户端中合并,是否保存在用户会话中,当您浏览向导时会发生什么,并且在保存之前对象必须是瞬态的?您将如何同步客户端和服务器端状态?数据库更改时会发生什么 - 客户端是否中断?

看看现有技术的趋势,包括Spring MVC:模式是构建两个项目:1)restful webservices 2)用户界面。 State通过不可变域模型共享。当然你最终可能会维持一组dtos,但它们是可预测的,便宜的,并且无限扩展。

我的推荐?如果要重用服务器端验证,请避免通过线路发送代理对象并在客户端上处理dtos或与客户端共享域模型。可以通过Ajax通过细粒度的api调用加载延迟集合。这样,您就可以完全控制客户端。

这就是社交网络在过去五年中的规模。

相关问题