現在,我的有狀態EJB(3.0)中的操作拋出SQLException(超時已過期)。的方法,它發生了:如何處理丟棄的有狀態會話bean
private MyBean myBean;
@EJB(name = "messageloaderbean")
public void setMyBean(MyBean myBean) {
this.myBean = myBean;
}
然後將其引用作爲參數調用類傳入:
@PersistenceContext(unitName = "MYPU")
EntityManager entityManager;
List<Message> list;
public List<Message> newSearch() {
// do some unsignificant things
loadFirstPage();
}
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public List<Message> loadFirstPage() {
CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
list = getEntityManager().createQuery(cq).getResultList();
}
這SFSB已在其他類被注入
public class Controller{
private MyBean myBean;
public Controller(MyBean myBean){
this.myBean = myBean;
}
public void methodThatCallsMyBean(){
this.myBean.newSearch();
}
}
什麼如果發生運行時異常(如SQLException),現在發生,因爲我使用的是CMT,並且根據EJB規範,容器首先回滾事務,然後放棄EJB。然後,如果我想在廢棄後再次使用這個EJB,我會得到一個javax.ejb.NoSuchEJBException: Bean has been deleted
。
這是有道理的,因爲這個bean已經被丟棄了,但是我怎樣才能得到一個新的有狀態bean的引用呢?
我是否應該在我的SFSB中捕獲異常並避免這種丟棄?如果我發現異常情況,交易狀態如何?我必須做一些手動回滾?
謝謝。