我试图得到我的头围绕CDI和EJB和实体边界控制(ECB)模式。我对欧洲央行模式的理解是,边界是交易边界的开始和结束。此外,CDI不像EJB那样提供事务支持。
因此,如果我想成功实现ECB模式,那么以下是正确的;
- 我可以用EJB实现边界部分(即@无状态,@有状态,@singleton),用CDI或EJB实现控制层。
- 我可以用CDI实现边界和控制部分,但在边界中实现类似(http://smokeandice.blogspot.com/2009/12/cdi-and-declarative-transactions.html)的事务支持 我不能用CDI实现边界,然后在控制层开始使用EJB。
谢谢
我成功地在JavaEE 6中实现了ECB模式,仅使用EJB的边界和CDI的控制器。在我的体系结构中,典型的堆栈使用
- 用JAX-RS注释的无状态EJB实现REST服务作为边界
- @Dependent作用域中用于业务逻辑的CDI管理bean作为Controller
- 使用JPA的EntityManager与数据库交互的数据访问对象的@Dependent作用域中的CDI管理bean
- JPA实体bean
构成边界的无状态EJB总是用@TransactionAttribute(REQUIRED)注释,这是默认的。我不使用其他事务属性。这样做,您可以确保与边界的每个交互都恰好发生在一个事务中。
通过仅为CDI托管bean使用@Dependent作用域,您可以确保每个线程都有自己的bean实例。因此,不会有多个线程同时访问CDI托管bean。这样做可以避免典型的并发性问题。
在边界使用更重的、池化的EJB,在应用程序的其余部分使用轻量级的CDI托管bean,对我来说效果非常好。