EJB与CDI和“实体边界控制”模式

时间:2011-12-21 06:22:07

标签: java java-ee ejb cdi ecb-pattern

我试图了解CDI和EJB以及实体边界控制(ECB)模式。我对ECB模式的理解是边界是事务边界的起点和终点。除此之外,CDI不像EJB那样提供事务支持。

因此,如果我想成功实现ECB模式,那么以下是正确的;

  1. 我可以使用EJB(即@stateless,@ stateful,@ sortton)实现Boundary部分,使用CDI或EJB实现Control层。
  2. 我可以使用CDI实现边界和控制部分,但在边界中实现事务支持类似于(http://smokeandice.blogspot.com/2009/12/cdi-and-declarative-transactions.html)
  3. 我无法使用CDI实现Boundary,然后在Control层中开始使用EJB。
  4. 由于

1 个答案:

答案 0 :(得分:13)

我成功地在JavaEE 6中实现了ECB模式,使用EJB仅用于Boundaries和CDI用于控制器。我的架构中的典型堆栈使用

  • 无状态EJB使用JAX-RS注释进行注释以将REST服务实现为边界
  • CDI托管@Dependent范围内的业务逻辑bean作为Controller
  • 使用JPA的EntityManager与数据库交互的数据访问对象的@Dependent范围内的CDI托管bean
  • JPA实体bean

构成Boundary的无状态EJB总是使用@TransactionAttribute(REQUIRED)进行注释,这是默认值。我不使用其他事务属性。这样做,您可以确保与Boundary的每次交互都只发生在一次交易中。

通过仅使用CDI托管bean的@Dependent作用域,可以确保每个线程都有自己的bean实例。因此,您永远不会有多个线程同时访问CDI托管bean。这样做可以防止出现典型的并发问题。

使用更重的组合,用于Boundary的集合EJB和用于其余应用程序的轻量级CDI托管bean对我来说非常好。