WEB开发网
开发学院软件开发Java Spring Web Flow 2 中流管理的持久化 阅读

Spring Web Flow 2 中流管理的持久化

 2010-05-18 00:00:00 来源:WEB开发网   
核心提示: 如果希望刷新发生在 <end-state/> 之前,您需要在用 @Transactional 注释的 Spring bean 方法之一中调用 entityManager.flush(),Spring Web Flow 2 中流管理的持久化(8),直接从 Web 流调用,<eva

如果希望刷新发生在 <end-state/> 之前,您需要在用 @Transactional 注释的 Spring bean 方法之一中调用 entityManager.flush()。

直接从 Web 流调用,<evaluate expression="persistenceContext.flush()"/>,行不通,因为没有事务绑定到任何 Spring Web Flow 标签,除了 <end-state commit="true"/>。您会得到以下错误消息:

"javax.persistence.TransactionRequiredException: no transaction is in progress" 

本文稍后我们会回到 “Hotel Booking” 这个示例,来了解 没有流作用域持久化上下文的持久化编程 所面临的挑战。

关于事务传播的更多信息

我已经介绍了事务如何根据其 propagation 属性的值进行传播,但是我忽略了一个特别的用例:如果标有 @Transactional(readOnly=true, propagation=Propagation.REQUIRED) 的方法要调用另一个标有 @Transactional(readOnly=false, propagation=Propagation.REQUIRED) 的方法,或者情况相反,那么事务又将如何传播呢?

Spring Web Flow 用一种简单而聪明的方式处理了这个问题:它忽略了第二个方法上的 readOnly 属性值。简而言之,初始化为只读的事务会保持只读状态,直到它结束,而且反之亦然。

这对于在流管理的持久化中是不使用事务还是使用只读事务的问题产生了有趣的影响。

只读事务的一个用例

应用程序服务层的 Spring bean 可以通过一些 JAX-WS/JAX-RS 注释公开为可重用的 SOAP/REST Web 服务。在这些 @Service bean 或其方法中应用 @Transactional 将 Web 服务调用与数据库事务绑定到了一起(没有明显的原因要在 DAO @Repository bean 上使用 @Transactional,除非应用程序具有级联式层架构,其中没有其他地方供开发人员指定事务属性)。

上一页  3 4 5 6 7 8 9 10  下一页

Tags:Spring Web Flow

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接