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同步回调被正确调用。
分享到:
相关推荐
5. **持久化支持**:讨论Seam对JPA和Hibernate的支持,包括实体管理和事务管理。 6. **安全管理**:学习Seam的认证和授权机制,如使用Security子模块。 7. **事件和回调**:了解Seam事件系统的工作方式,以及如何...
2. **JPA集成**: Seam支持JPA,方便地处理数据库操作,包括实体管理和事务控制。 3. **EJB 3集成**: Seam与EJB 3的集成,使得企业级服务的开发变得简单,如会话bean、实体bean等。 4. **WS和JMS集成**: Seam还提供...
10. **Seam安全性和事务管理**:Seam提供了内置的安全框架和事务管理机制,学习如何配置和使用这些特性对于构建安全、可靠的业务应用非常重要。 总之,在开始Seam之旅之前,开发者应具备扎实的Java EE基础,了解...
还有可能包含`seam-core.jar`,这是Seam框架的基础模块,提供了核心功能,如事件处理、安全性、会话管理和事务管理。此外,`seam-persistence.jar`可能包含Seam对JPA(Java Persistence API)的支持,用于数据库持久...
Seam 2.0与JPA的集成使得数据库操作变得更加简单,支持实体管理和事务控制。 三、Seam 2.0的开发工具和资源 在`jbosseam2.0文档.CHM`中,开发者可以找到详细的API参考、教程、最佳实践以及常见问题解答。这份文档...
3. **事务管理**:Seam自动管理Hibernate的事务,使得开发者无需编写繁琐的事务控制代码。在JSF动作事件触发时,Seam可以自动开启、提交或回滚事务。 4. **安全性和身份验证**:Seam提供了内置的安全框架,可以轻松...
其中,AOP使得开发者可以方便地定义横切关注点,如日志、事务管理等,提高代码的可维护性。 《Seam in Action》这本书详细介绍了如何使用Seam进行实际项目开发,包括设置环境、创建Seam应用、使用Seam组件、调试和...
- 包括 EJB 的事务管理、安全性等设置。 - **1.2.1.8 EJB 持久化部署描述符:persistence.xml** - 此文件定义了持久化单元和数据源配置。 - 包括数据源名称、JPA 提供者等信息。 - **1.2.1.9 视图:register....
它不仅与Java Persistence API(JPA)紧密配合,实现了数据持久化,还通过Seam Transactions管理事务,确保了业务操作的完整性和一致性。此外,Seam还支持Spring、Hibernate等流行框架,使得开发者可以充分利用现有...
Seam对数据库资源管理和事务的处理也表现出色。它将这些复杂性完全封装起来,避免了Spring中常见的手动事务管理与数据库访问问题。Seam的这种全栈式框架特性使得它可以隐藏这些底层实现,减轻了开发者的负担。 另外...
Seam 是一个强大的 Java EE 框架,它整合了 JSF、EJB 3、CDI 等技术,提供了丰富的功能,如事务管理、安全控制、状态管理等。 Seam-gen 提供了两种使用方式:命令行脚本和 IDE 插件。命令行版本基于 Ant,生成的...
此外,Seam还整合了`EJB`,使得开发者可以轻松地利用EJB的强大功能,如事务管理、安全性和可扩展性。 `Ajax`支持使得Seam应用能够实现部分页面更新,提供更流畅的用户体验。Seam与`RichFaces`的集成则进一步增强了...
4. **安全和事务管理**:学习Seam的安全框架和事务管理机制,确保应用的安全性和数据一致性。 5. **富客户端集成**:了解如何将Seam与RichFaces等富客户端框架结合,创建交互性强的Web应用。 6. **开发流程和实践**...
《JBoss Seam》是另一本关于Seam的著作,它不仅介绍了Seam的基本功能,还提供了高级特性的深入讨论,包括事务管理、安全性、AOP(面向切面编程)和实时通信等。这本书有助于开发者更全面地理解和掌握Seam框架,提升...
- **EJB部署描述符**:`ejb-jar.xml`配置了EJB模块的信息,如事务管理、安全性等。 - **持久化部署描述符**:`persistence.xml`定义了持久层的配置,如数据源、实体映射等。 - **视图**:`register.jsp` 和 `...
**EJB(Enterprise JavaBeans)**:EJB是Java平台上的企业级组件模型,用于构建可部署在Java EE服务器上的分布式、事务处理、安全和可管理的企业级应用。EJB组件主要包括三种类型:Session Beans(用于处理业务逻辑...
Seam是一个Java EE框架,它将企业...在实践中,不断探索Seam的高级特性,如CDI(Contexts and Dependency Injection)、EJB(Enterprise JavaBeans)集成、以及安全和事务管理,将有助于进一步提升开发效率和应用质量。
在Seam工程中,EJB常被用作业务逻辑层,处理数据库操作、事务管理等。EJB有三种主要类型:Stateless Session Beans(无状态会话豆)、Stateful Session Beans(有状态会话豆)和Message-driven Beans(消息驱动豆)...