编程语言
首页 > 编程语言> > java – 为给定的PersistenceContext注入了多少个EntityManager?

java – 为给定的PersistenceContext注入了多少个EntityManager?

作者:互联网

我在无状态EJB3 bean中注入EntityManager对象(它们充当DAO对象,并且每个都提供对不同数据库表的访问).部署在JBoss AS 7中.

然后,我在EJB3 beans方法中使用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的代理.

解决方法:

是的,它们是真实实体管理器的代理(实际上,我认为它们是线程安全装饰器,而不是代理).

我不确定你是否知道EntityManager是一个连接的包装器.如果您没有这个装饰器(或代理),那么对该无状态bean的所有调用都将共享相同的连接(并且可能是事务),这不是您想要的.

标签:java,jpa,ejb-3-0
来源: https://codeday.me/bug/20190725/1536670.html