2014-02-21 130 views
0

假设我有一个简单的名为db-utils的库,它有一个CrudService CDI bean(requestScoped),我的Web应用程序使用它来执行CRUD操作。EJB无状态会话Bean中的CDI bean生产者

我也有一个名为grad-db的EJB项目,它具有从数据库映射的实体。 Grad-db也有生产者用来在db-utils的CrudService中设置entityManager。

我已经试过了,显然它工作正常。我的问题是:这是一个不好的做法?在无状态会话bean中生成CDI bean并将EJB无状态bean作为参数传递给CrudService会有什么后果吗?

我的代码:

EJB豆(研究生-DB):

@Stateless 
public class CrudServiceCae extends AbstractCrud implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @PersistenceContext(unitName = "cae-pu") 
    EntityManager em; 

    @Override 
    public EntityManager getEntityManager() { 
     return em; 
    } 

    @Produces 
    @Database(Schema.CAE) 
    public CrudService createCrudServiceCou() { 
     return new CrudService(this); 
    } 
} 

CrudService(DB-utils的):

@Named("crudService") 
public class CrudService implements Serializable { 

    private static final long serialVersionUID = -2607003150201349553L; 

    private AbstractCrud crud; 

    public CrudService(AbstractCrud abstractCrud) { 
     this.crud = abstractCrud; 
    } 

    ... 
} 

编辑: 其实它的工作只为查询。当我试图插入数据时,我得到了javax.persistence.TransactionRequiredException。显然,在这种情况下,我将不得不使用继承而不是CDI。

回答

1

EJB可以响应业务流程/逻辑(即:方法),并且能够编排其他CDI控制器,因此您不希望使用CDI POJO Producer来创​​建对象。

在你的情况下,更精简的使用CDI对象,并从那里生成你需要的对象,看起来像一个DAO,可以使用(我的意思是注入)到EJB中。

使用专门的控制器,根据边界模式考虑EJB。

注:

  • @Stateless不需要实现Serializable,这些被集中,并且其生命周期不允许序列化。
  • 一般来说,您不想使用getter来访问EJB的实体管理器,您应该更喜欢编写一个方法并在内部使用em
  • 持久化上下文是更容易操作,如果使用JTA
  • 你@Stateless应该开始交易,让他们沿着控制器
  • em与包可见是个好主意传播,让你嘲笑你的门面/边界容易
相关问题