2010-07-15 51 views
2

Seam建議使用擴展持久上下文在有狀態會話Bean,以便擁有Seam管理的持久性。接縫管理的交易操作方法

我不清楚上述建議是否會影響我們希望進行Seam管理的交易的方式。這是因爲我們的架構不同。我們有一個無國籍 EJB下面的持久化上下文:

@Stateless 
@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public class CrudServiceBean implements CrudService { 

    @PersistenceContext(type = PersistenceContextType.TRANSACTION) 
    private EntityManager em; 
... 
} 

我們的DAO調用上述CrudServiceBean是無狀態的EJB(其中一些還Seam組件)與@TransactionAttribute(TransactionAttributeType.REQUIRED)。所以,我們的交易是由容器(的WebLogic),而不是Seam處理。我們現在需要滿足以下場景:我們需要一個前端Seam組件(非EJB)調用多個DAO(EJB)方法並將它們全部包裝在單個事務中。如果我理解正確,我們需要擁有Seam管理的事務。

纔能有Seam管理的事務,如我所描述的,而不必Seam管理的持久化上下文情景?或者兩者不相關?

回答

2

至於說

我們需要有一個單一的交易前端Seam組件(非EJB)調用多個DAO(EJB)方法和包裹個個

我們的交易由CONTA處理核能研究所 - 也稱爲容器管理事務(它會調用begin和commit每個底層的資源管理器事務使用方法照顧容器)

第一個問題是,你有這樣一個場景,一個非EJB調用多個DAO,每一個的EJB。你能想到的

@Name("nonEjbComponent") 
public class NonEjbComponent { 

    private @In DaoEjbComponent daoEjbComponent; 
    private @In OtherDaoEjbComponent otherDaoEjbComponent; 
    private @In AnotherDaoEjbComponent anotherDaoEjbComponent; 

    private @In UserTransaction userTransation; 

    public void wrapperAllOfThem() { 

     userTransation.begin(); 

      daoEjbComponent.save(someEntity); 
      otherDaoEjbComponent.update(otherEntity); 
      anotherDaoEjbComponent.delete(anotherEntity); 

     userTransation.commit(); 

    } 

} 

但是Java EE 3.0規範狀態

的企業Bean,無論是bean管理或容器管理事務劃分必須是會話bean或消息驅動bean

所以你不能使用上面的情況。而由於所有的DAO都使用容器管理的事務,Java EE規範不允許使用容器管理和Bean管理的事務同時

因此,解決辦法是

將所有DAO包裝在EJB無狀態會話bean 中,其事務是容器管理的。它會像一個委派組件

@Stateless 
@TransactionAttribute(TransactionAttributeType.REQUIRED) 
@Name("wrapperStateless") 
public class WrapperStatelessImpl implements WrapperStateless { 

    private @In DaoEjbComponent daoEjbComponent; 
    private @In OtherDaoEjbComponent otherDaoEjbComponent; 
    private @In AnotherDaoEjbComponent anotherDaoEjbComponent; 

    public void wrapperAllOfThem() { 

     daoEjbComponent.save(someEntity); 
     otherDaoEjbComponent.update(otherEntity); 
     anotherDaoEjbComponent.delete(anotherEntity); 

    } 

} 

而你非EJB組件內部,使用

@Name("nonEjbComponent") 
public class NonEjbComponent { 

    private @In WrapperStateless wrapperStateless; 

    public void wrapperAllOfThem() { 
     wrapperStateless.wrapperAllOfThem(); 
    } 

} 
+0

我只是想了解這裏。這是否意味着如果我有nonEJB接縫組件,接縫無法管理交易,我必須遵循這裏描述的類似模式? – Arash 2012-03-05 21:51:55