如何从不是 EJB 的类中获取 EntityManager?此外,此类不由容器管理。我可以从 JNDI 获得参考吗?有什么办法吗?
谢谢
首先,您需要声明一个持久性单元/上下文引用。如果你想使用@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();
我测试了它并且它有效。