EJB会话Bean有声明式事务管理功能。当Bean被调用时,EJB容器能够透明地开始一个事务,在调用结束时关闭此事务。 如果我们写了一个作为JSF动作监听器的会话Bean方法,我们就可以在一个事务内处理所有与此action相关的工作,并且当我们完成此动作处理时事务必须被提交或回滚。 这是一个很棒的功能,在很多Seam应用程序中这是必需的。
但是,此方法还是有问题。Seam应用可能无法在对会话Bean的一次方法调用请求中完成所有的数据访问。
此请求可能由几个松耦合组件处理,Web层独立地调用每一个组件。在Seam中,Web层的一个请求对EJB组件发起几次甚至多次调用的现象是很常见的。
视图渲染可能需要延迟关联获取(lazy fetching of associations)。
每个请求的事务量越多,当我们的应用处理大量并发请求时越可能碰到原子和隔离问题。当然,所有的写操作要在一个事务中执行。
Hibernate用户开发了 "Open Session in View" 模式来解决该问题。 在Hibernate社区,"Open Session in View"曾经非常重要,这是因为像Spring这样的框架使用了事务作用域持久化上下文。 所以当未获得的关联被访问时渲染视图将引起 LazyInitializationException 异常。
这个模式通常作为一个跨越整个请求的事务来实现。 此实现方式会有几个问题,其中最严重的是只有我们提交了事务才能确认它成功完成——但在"Open Session in View"的事务提交时,视图已经完全渲染了,甚至渲染好的应答可能已经刷新到客户端。我们怎样才能通知用户他们的事务已失败呢?
Seam在解决"Open Session in View"问题时,也解决了事务隔离和关联获取问题。该方案有有两个部分:
使用使用已扩展持久化上下文,可以覆盖一个会话作用域而不是单个事务作用域。
每次请求使用两个事务;第一个从更新模型值的起始阶段到应用程序调用结束;第二个跨越渲染响应阶段。
首先我们需要你知道如何启用Seam事务管理。 注意你可以脱离Seam的事务管理来使用会话作用域持久化上下文。当你不使用Seam管理的持久化上下文时,你也有很多使用Seam事务管理的理由。 然而这两种功能被设计为一起使用的,一起使用时效果最好。
即使你使用EJB 3.0容器管理事务上下文,Seam事务管理也是很有用的。如果你在Java EE 5环境外使用Seam,或者在任何你想使用Seam管理的持久化上下文时,它同样很有用的。
关闭Seam管理的事务
所有的JSF请求默认开启Seam事务管理。如果你想 关闭 该功能,你能在 components.xml 文件中做如下设置:
<core:init transaction-management-enabled="false"/>
<transaction:no-transaction />
配置Seam事务管理器
Seam为事务的开始,提交,回滚,同步提供了一个事务管理抽象。默认情况下,Seam使用一个JTA事务组件,它同容器管理的EJB和编程式EJB事务集成。
Seam还为以下事务API提供事务组件:
javax.persistence.EntityTransaction 接口提供的JPA RESOURCE_LOCAL事务。
org.hibernate.Transaction 接口提供的Hibernate管理的事务。
org.springframework.transaction.PlatformTransactionManager 接口提供的Spring管理的事务。
显式关闭Seam管理的事务。
向components.xml文件增加以下项来配置JPA RESOURCE_LOCAL事务,在配置文件中,#{entityManager} 是 persistence:managed-persistence-context 组件的名称。(参考 Seam管理的持久化上下文。)
<transaction:entity-transaction entity-manager="#{entityManager}"/>
向你的components.xml文件声明以下项来配置Hibernate管理的事务,在配置文件中,#{hiberanteSession} 是项目中 persistence:managed-hibernate-session 组件的名称。(参考Seam管理的持久化上下文)
<transaction:hibernate-transaction session="#{hiberanteSession}"/>
在components.xml中声明以下内容来显式地关闭Seam管理的事务:
<transaction:no-transaction />
参考 使用Spring PlatformTransactionManagement 来配置Spring管理的事务。
事务同步
事务同步为各种各样的事务相关事件提供了回调功能,例如 beforeCompletion() 和 afterCompletion() 事件。 默认情况下,Seam使用它自己的事务同步组件,一个事务被提交时,需要显式地使用Seam事务组件以确保同步回调被正确执行。 如果在Java EE 5环境里,应该在components.xml文件中声明 <transaction:ejb-transaction/>,从而保证容器在Seam的可预见范围外提交事务时,Seam同步回调被正确调用。
分享到:
相关推荐
seam_carving代码实现 图像缩放
• 身份管理 - 用于管理Seam程序中所涉及的用户及角色的接口 • 权限验证 - 一个应用十分广泛的权限验证框架,支持用户角色、持久化和基于规则的权限设置,能够灵活地实现属于用户自己的安全设置 • 权限管理 - 一组...
seam in action seam in action seam in action seam in action seam in action seam in action seam in action
Seam 是一种业级 企 Java 的应规用程序框架。它的灵感源自下列原 : 只有一种“工具” Seam为 应 业务业业 义 种统 组 你的 用程序中所有的 定 了一 一的 件模型。 Seam组件可能是 态义 关关 态 有状 的,包含与几...
JBOSS_SEAM配置
seam级联菜单例子
seam介绍
JBoss Seam JBoss Seam JBoss Seam
seam资料seam资料seam资料seam资料seam资料seam资料seam资料seam资料
seam carving的相关代码实现
seam下一代web开发框架
NULL 博文链接:https://ssailyang.iteye.com/blog/289761
seam 中文文档 pdf 格式 JSF+EJB3.0快速开发框架Seam的中文版向导。。。
Jboss Seam in ActionJboss Seam in ActionJboss Seam in ActionJboss Seam in ActionJboss Seam in Action
Seam - 语境相关的组件[满江红20071230]............................................................................................................................ 1 Java EE 框架...........................
SeamCarving的C++实现代码,使用opencv库。包含完整项目工程及测试图像,可直接使用
JBOSS SEAM组件中文手册 Seam_2.0_Reference_zh_CN
seam框架需要的所有jar包,支持seam ui组件
seam中的注解总结,包括三种JPA和seam自身的标签
Seam全称是Jboss Seam,是一个Java EE 5框架。它通过把JSF与EJB3.0组件合并在一起,以及利用JDK5.0的Annotation技术,从而为开发基于Web的企业应用程序提供一个最新的模式。