2011-12-21 48 views
6

我试图让我的头脑围绕CDI和EJB以及实体边界控制(ECB)模式。我对欧洲央行模式的理解是,边界是交易边界的开始和结束。除此之外,CDI不像EJB那样提供事务支持。EJB vs CDI和“实体边界控制”模式

所以,如果我想成功实施ECB模式,那么以下是真实的;

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

感谢

+1

那么问题是什么呢? – 2011-12-21 09:46:40

+0

我只是想检查我的想法,我提到的3点是正确的?或者如果我的想法是错误的。 – vcetinick 2011-12-21 22:59:29

回答

12

我成功地使用EJB的专为界限,CDI的控制器实现的JavaEE 6 ECB模式。在我的建筑典型的堆栈使用

  • 无状态EJB与JAX-RS注解来实现REST服务为边界
  • CDI管理业务逻辑豆在@Dependent范围为控制器注释
  • CDI管理的bean在数据访问对象的范围@Dependent它们使用JPA的EntityManager的与数据库进行交互
  • JPA实体bean

无状态EJB的形成的Bounda ry总是用默认的@TransactionAttribute(REQUIRED)注解。我不使用其他事务属性。这样做,您可以确保每次与边界的交互都发生在一次交易中。

通过仅为CDI托管的Bean使用@Dependent范围,可以确保每个线程都有自己的那个bean实例。所以,你永远不会有多个线程同时访问一个CDI托管bean。这样做可以防止出现典型的并发问题。

结合使用更重的权重,边界的EJB集合和适用于其余应用程序的轻量级CDI托管bean对我来说表现非常好。