事务管理和CDI

5
我希望使用CDI(通常使用Spring)开发一个应用程序,以了解这项技术。
我已经阅读了许多关于CDI的文章来学习它的工作原理。我有一个简单的问题,关于事务管理(例如数据库持久化):
是否必须使用EJB 3.1才能进行事务管理,还是只能使用CDI进行事务管理?
谢谢。

事务超出了CDI规范的范围。虽然可能存在使用CDI拦截器的声明式事务框架。 - JB Nizet
3个回答

8
不,你可以使用CDI来做到这一点。你只需要创建一个拦截器来启动、提交或回滚事务。这真的不难。在Java EE 7中,所有托管bean(JSF、CDI、EJB等)都将有一个CDI拦截器@Transactional
编辑:如果你想看一下已经完成的一些拦截器,Apache DeltaSpike和Seam 3(不再开发)有处理事务的拦截器。

谢谢你的回答。那么,你认为是使用ejb 3.1(保持标准)还是创建CDI拦截器更好?我不想使用seam 3,因为正如你所说,它已经不再开发了。 - Kiva
说实话,这完全取决于你的需求。如果你需要 EJB 的其他一些功能,如池化、安全性等,那就选择 EJB;否则,创建拦截器并使用它(实际上仍然是标准的,因为你没有做任何不在平台内的事情,只是使用了一些不同的粘合剂)。 - LightGuard

2
到目前为止(在Java EE 7推出之前),您可以像Adam Bien在他的帖子中展示的那样,将CDI(不再使用@ManagedBean)与EJB(事务特性)混合使用。
@Stateless
@Named("helloService")
public class HelloService {

    @EJB ClockService clockService;

    public String getHello(){
        return "Hello from EJB / CDI: " + clockService.currentTime();
    }
} 

这个的好处是,你的 EJB 直接暴露给了视图层,不需要使用 @Interceptor,但是不要滥用这种方法,否则可能会导致视图层和控制层之间高度耦合。
根据 JavaEE7 规范:“虽然 CDI、JSF 和 EJB 已经建立在一个称为托管 Bean 的共同但非常抽象的概念上,但似乎 JSF 托管 Bean 可能会被放弃,改用 CDI,而 EJB 可能会作为一组 CDI 服务进行改装。”
参考资料:
  1. http://www.adam-bien.com/roller/abien/entry/ejb_3_1_killed_the

  2. http://jdevelopment.nl/open-source/java-ee-7-progress-page/


2

事务管理是一个不同的API,因此无论您是使用CDI还是EJB,都不影响其使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接