我在无状态EJB3 bean 中注入EntityManager对象(它们充当DAO对象,每个都提供对不同数据库表的访问)。部署在JBoss AS 7中。
然后,我在EJB3 bean 方法中使用System.identityHashCode添加了代码,以查看注入的EntityManagers的各种实例(希望在所有 DAO 中看到相同的实例)。例如:
@Stateless
public class AFacade {
@PersistenceContext(unitName="foo")
EntityManager em;
public List<A> findAll() {
l.info("entity manager is: "+System.identityHashCode(em)+" class is: "+em.getClass().getSimpleName());
...
}
然而,我注意到每个DAO(例如AFacade、BFacade等)都注入了不同的EntityManager(由identityHashCode报告),尽管PersistenceContext是相同的。在所有情况下,实现类都是TransactionScopedEntityManager 。
我不清楚为什么要注入这些不同的EntityManager对象,这是否应该让我担心。另外,我知道 EJB3 容器实际上可能会向真实的EntityManager注入代理,因此这些不同的实例实际上可能是单个EntityManager的代理。