我正在尝试通过使用上下文查找在 POJO 中注入 EJB。我期待的是当你做一个 EJB 的无状态行为时
@EJB annotation
EJB 有一个 entityManager,我从构造函数中的 EntityManagerFactory 获得,用于 thr EJB
@Stateless
Class ReprovProcess implements ReprovisioningProcess {
protected EntityManager em;
public ReprovProcess(){
//init em from entityManagerFactory;
}
public EntityManager getEm(){
return em;
}
}
@LocalBinding(jndiBinding = "ReprovProcess/local")
class interface ReprovisioningProcess {
}
接下来我查找 EJB 两次,这样
在第一次检索时,我关闭了 entitymanager
然后在第二次查找时,我应该看到 EntityManager 已打开,因为我期待类似无状态 EJB 的行为。
但我没有观察到这一点。我第二次进行查找并执行em.isOpen()
,我得到一个错误。
所以问题是:context.lookup 能否用于获得类似 EJB 的无状态行为?如果不是可以用什么?
ReprovisioningProcess pro = (ReprovisioningProcess)
ic.lookup("ReprovProcess/local");
EntityManager em = pro.getEm();
System.out.println("Entity Manager State = "+em.isOpen());
em.close();
System.out.println("Entity Manager State = "+em.isOpen());
pro = (NetElementReprovisioningProcess) ic.lookup("ReprovProcess/local");
em = pro.getEm();
System.out.println("Entity Manager State = "+em.isOpen());
em.close();
System.out.println("Entity Manager State = "+em.isOpen());
输出是
Entity Manager State = true
Entity Manager State = false
Entity Manager State = false
------------- ---------------- ---------------
EntityManager is closed
java.lang.IllegalStateException: EntityManager is closed
at org.hibernate.ejb.EntityManagerImpl.close(EntityManagerImpl.java:97)
at com.cisco.cgms.factoryconfig.reprovision.ReprovisiongGroupTest.testIntialLookup(ReprovisiongGroupTest.java:135)