2014-02-21 185 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與包可見是個好主意傳播,讓你嘲笑你的門面/邊界容易
相關問題