容器管理的实体管理器将与当前的JTA事务一起自动传播
EntityManager,并且映射到同一持久性单元的引用提供对该事务中的持久性上下文的访问。因此,除了并发问题外,从一个实例中共享一个实体管理器不是一个好习惯,这将导致您在bean上调用的每种方法都使用相同的事务上下文。
一个满足您需求的简单解决方案是
EntityManagerFactory在bean中注入引用并创建
EntityManager调用该
createEntityManager()方法的对象。缺点是您应该手动管理事务,而不再依赖容器。
否则,另一种方法可能是将所有实体管理器注入到主企业bean中,并使用向您传递适当管理器的方法在服务bean中实现业务逻辑。后一种解决方案的示例:
@Statelessclass MainBean { @PersistenceContext EntityManager em1; @PersistenceContext EntityManager em2; ... @EJB WorkerBean1 workerBean1; @EJB WorkerBean2 workerBean2; ... void method1(Object param1, Object param2) { workerBean1.method1(em1, param1, param2); } void method2(Object param1, Object param2, Object param3) { workerBean2.method2(em2, param1, param2, param3); } ...}@Statelessclass WorkerBean1 { void method1(EntityManager em, Object param1, Object param2) { ... } ...}@Statelessclass WorkerBean2 { void method2(EntityManager em, Object param1, Object param2, Object param3) { ... } ...}


