Jakarta ee 从非托管类获取EntityManager

Jakarta ee 从非托管类获取EntityManager,jakarta-ee,jpa,ejb,Jakarta Ee,Jpa,Ejb,如何从不是EJB的类中获取EntityManager?此外,这个类不是由容器管理的。我可以从JNDI获得一个参考吗?有办法吗 谢谢首先,您需要声明一个持久化单元/上下文引用。如果您想使用@PersistenceUnit(name=“jpa/pu”,unitName=“…”)或@PersistenceContext(name=“jpa/pc”,unitName=“…”)注释,则必须将这些注释放在支持注入的类(例如servlet或EJB类)上,如果您只想从支持注入的类之外使用它们,您可以将它们放在类

如何从不是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进行注释)

我对它进行了测试,效果良好


已经试过了。返回null,因为该类不受容器管理。@MikeArgyriou否,它是null,因为您指定的JNDI查找字符串不正确。失败的查找在任何情况下都不应返回null。请注意,尽管这似乎有效,创建单独的EntityManagerFactory的危险在于它与容器创建和管理的默认工厂不同。因此,NamedQueries之类的东西将不可见,托管实体可能会有所不同,并启用脏操作。
EntityManagerFactory emf = (EntityManagerFactory) new InitialContext().lookup("java:comp/env/jpa/pu");
EntityManager em = (EntityManager) new InitialContext().lookup("java:comp/env/jpa/pc");
EntityManagerFactory factory = Persistence.createEntityManagerFactory("persistenceUnitName");
EntityManager entityManager =  factory.createEntityManager();