0
實現此用例的最佳方式是什麼?用於長時間通話的JavaEE EntityManager
圖片我有一個EJB A
這是一種頂級業務流程調用者。它調用其他bean。如果在其他bean的調用期間發生異常,那麼我想要回滾A
完成的所有操作。
我想要在A
bean中注入EntityManager一次,然後將它傳遞給其他bean。這被認爲是一種良好的做法?
實現此用例的最佳方式是什麼?用於長時間通話的JavaEE EntityManager
圖片我有一個EJB A
這是一種頂級業務流程調用者。它調用其他bean。如果在其他bean的調用期間發生異常,那麼我想要回滾A
完成的所有操作。
我想要在A
bean中注入EntityManager一次,然後將它傳遞給其他bean。這被認爲是一種良好的做法?
使用容器管理交易,如此處所述:https://docs.oracle.com/cd/E16439_01/doc.1013/e13981/servtran002.htm。
把下面的註釋對你的bean類:@TransactionManagement(值= TransactionManagementType.CONTAINER)
而上的方法,在調用其他豆類以下注釋:@TransactionAttribute(值=必填)
並確保其他bean將拋出異常以回滾事務。
這只是一個簡單的用例,我強烈建議閱讀EJB事務管理。
實施例:
@Stateless
public static class A{
@PersistenceContext(unitName="a")
private EntityManager em = null;
@Inject
private B b = null;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void doInTransaction(){
//get some data from em
//modify and save back to b
b.save(data);
}
}
public static class B{
@PersistenceContext(unitName="a")
private EntityManager em = null;
public void save(data){
//save against em
//catch JPA exception and throw back as RuntimeException
}
}
由於FOT尖端。我已經讀過關於事務管理的一些東西如果我正確理解,如果我使用事務管理,那麼實體管理器的注入是由它控制的?所以就像我向我的'A'注入Bean時,在'A'上指定事務管理,然後將實體管理器注入到其他bean中,然後注入由'A' bean的事務管理控制。我對嗎? –
EntityManager注入由EJB容器控制,而不是由事務處理。您不必將EntityManager傳遞給A正在使用的其他bean。反過來,他們應該讓EntitytManager在創建時由容器注入,除非您通過「new」關鍵字在代碼中手動創建這些bean。 – tsolakp