【发布时间】:2013-07-11 11:00:43
【问题描述】:
如何从不是 EJB 的类中获取 EntityManager?此外,此类不由容器管理。我可以从 JNDI 获得参考吗?有什么办法吗?
谢谢
【问题讨论】:
标签: jakarta-ee jpa ejb
如何从不是 EJB 的类中获取 EntityManager?此外,此类不由容器管理。我可以从 JNDI 获得参考吗?有什么办法吗?
谢谢
【问题讨论】:
标签: jakarta-ee jpa ejb
首先,您需要声明一个持久性单元/上下文引用。如果您想使用@PersistenceUnit(name="jpa/pu", unitName="...") 或@PersistenceContext(name="jpa/pc", unitName="...") 注释,则必须将它们放在可注入的类上(例如,在 servlet 或 EJB 类上),并且如果您只想从可注入的类外部使用它们,您可以将它们放在类上(如果有多个,可能放在@PersistenceUnits 或@PersistenceContexts 容器注释中)。或者,您可以在 web.xml(或 ejb-jar.xml)中指定相同的元数据。
其次,您需要使用引用中声明的名称执行 JNDI 查找。使用上面的例子,这将是这样的:
EntityManagerFactory emf = (EntityManagerFactory) new InitialContext().lookup("java:comp/env/jpa/pu");
EntityManager em = (EntityManager) new InitialContext().lookup("java:comp/env/jpa/pc");
请注意,必须在声明的引用的上下文中执行查找。例如,如果您的 servlet 调用另一个使用 JPA 的类,那么您需要在 web.xml 中声明引用(或注释 servlet 类)。如果您的 servlet 调用的 EJB 调用另一个使用 JPA 的类,那么您需要在 ejb-jar.xml 中为该 EJB 声明引用(或注释 EJB)。
【讨论】:
EntityManager em = (EntityManager) new InitialContext().lookup("java:comp/env/persistence/em");
【讨论】:
EntityManagerFactory factory = Persistence.createEntityManagerFactory("persistenceUnitName");
EntityManager entityManager = factory.createEntityManager();
我测试了它,它可以工作。
【讨论】: