【问题标题】:Is there something analogous to Springs @Transactional annotation available in Java EE 6?Java EE 6 中是否有类似于 Springs @Transactional 注释的东西?
【发布时间】:2011-06-21 11:08:12
【问题描述】:
在我的公司中,不鼓励使用 Spring 框架,而是提倡使用 Java EE 6。但最近我在Using @Transactional 上读到了 Springs @Transactional 注释,并认为这对我们的代码非常有用。
据我了解,使用@Transactional 注释的方法将重用现有事务或在调用该方法时如果不存在活动事务则打开新事务。 Java EE 6 中是否有类似的东西(例如类似的注解)?
【问题讨论】:
标签:
java
spring
transactions
java-ee-6
【解决方案1】:
EJB 组件在 Java EE 中具有这种事务控制。您可以将 EJB 上的方法的事务设置为Required、RequiresNew、Supports 等。您几乎总是使用无状态会话Bean (@Stateless) 来满足您描述的要求:
> @TransactionAttribute(value=[MANDATORY,
> REQUIRED, REQUIRES_NEW, SUPPORTS,
> NOT_SUPPORTED, NEVER]
必填,默认情况下,如果有一个正在运行的 txn 将重新使用现有的 txn,如果没有,则创建一个新的。 Java EE 6 附带 EJB 3.1,因此您甚至不需要业务接口,如果需要,您可以将 EJB 打包到 WAR 文件中。因此,您使用的是 EJB,但对于开发人员来说,如果您想要的只是 JTA 支持,那么它们更容易集成。
这是 EJB 注释的 useful cheat sheet,如果您在 Google 上搜索,这里有很多指南。
【解决方案3】:
在 Java EE 6 中,可以使用 TransactionAttribute 注释来注释 EJB bean 类本身,或 EJB(会话 EJB 和 MDB)中的各个业务方法。仅当您使用容器管理的事务时才能应用此功能。
注解的有效值在TransactionAttributeType注解中定义:
- 不支持
- 支持
- 必填
- REQUIRES_NEW
- 强制
- 从不
与早期版本的 EJB 规范相比,这些值的语义没有改变。这些注解从 Java EE 5 开始可用,当时 EJB 3.0 中引入了注解。请注意,某些值在某些情况下不适用 - 例如,MDB 不能使用 REQUIRED 和 NOT_SUPPORTED 以外的任何内容进行注释;对于 MDB 的容器管理事务,任何其他值都没有意义(毕竟,在这种情况下,容器必须创建事务或不可以)。
如果您想快速了解 EJB 3.0 和 Spring 模型之间的事务属性比较,我很乐意为您指明Java Transaction Design Strategies 的方向。免责声明:我只是这本书的满意读者。
【解决方案4】:
EJB(无状态和有状态)是默认事务组件,默认事务属性是必需的,类似于 spring..