有时,我的有状态 EJB (3.0) 中的操作会引发 SQLException(超时已过期)。它发生的方法:
@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 已注入另一个类:
private MyBean myBean;
@EJB(name = "messageloaderbean")
public void setMyBean(MyBean myBean) {
this.myBean = myBean;
}
然后它的引用在调用类中作为参数传递:
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 中捕获异常并避免这种丢弃?如果我捕捉到异常,事务的状态会怎样?我必须做一些手动回滚吗?
谢谢。