Spring Web Flow 2中流管理的持久化:事务性Web流的持久化策略 - 编程入门网
ooking){
booking = em.find(Booking.class, booking.getId()); // reinstate the persistent entity
if (booking != null) {
em.remove(booking);
}
}
以事务为作用域的持久化上下文与带有 singleSession=false 的 OpenSessionInViewFilter/Interceptor 的工作方式一样。这意味着同一请求中的每个事务都有其自己的相关会话。但是这里我们失去了 Open Session in View 的 “延迟关闭模式” 的优势。 在视图呈现期间,延迟读取将导致 LazyInitializationException 异常,因为以事务为作用域的持久化上下文会在每个事务完成后立即关闭。也可以选择实现类似于 OpenSessionInViewInterceptor / OpenEntityManagerInViewInterceptor 之类的东西,但是 Spring 核心包提供的那些东西不能开箱即用地为 Spring Web 工作。使用内置的流作用域的持久化上下文对象要简便得多! 作用域为每个调用的持久化上下文 没有流作用域持久化上下文协助的非事务性数据访问是情况最糟糕的场景,应该尽量避免。 事务之外,持久化上下文的作用域被划定到带有 FlushMode AUTO 和 auto-commit true 设置的每个调用(记住 Hibernate 为非事务性数据访问禁用了自动刷新)。换句话说,对通过 @PersistenceContext 注入的同一持久化上下文代理的每个方法调用都将返回一个不同的实体管理器实例,且这些实例会立即打开而后关闭。 从本质上来说,实体管理器的作用域划定成了 “短事务”。您在 清单 5 中看到的同样的代码片段将会发出以下的错误消息: java.lang.IllegalArgumentException: Removing a detached instance 在不同的流中传递实体 这是最后一个有时会引起问题的场景:需要在不同流中传递实体时会出现什么情况? 流作用域的持久化上下文对象服从于流的作用域,因此一旦从一个流向另一个流传递实体,这些实体就会立即分离。解决方法是将这些实体合并/重新连接到当前流的持久化上下文或者用其主键重新加载它们,这种策略仿效了 Open Session in View 方法。 结束语 Spring Web Flow 是一种先进的 Web 开发框架,提供了独特的功能以支持使用 JPA/Hibernate 的持久化编程和事务管理。本文探讨了 Java 开发人员在编写 Spring Web Flow 应用程序中面临的困难和挑战。 从真实世界用例中(比如本文介绍的用例),对于在 Spring Web Flow 中编码事务性原子和非原子 Web 应用程序,我总结出了以下 “规则”: 首选的是使用流作用域持久化上下文 全局性地将只读事务应用到原子 Web 流中引用的所有方法 全局性地将读/写事务应用到非原子 Web 流中引用的所有方法 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |