如何从不是EJB的类中获取EntityManager?此外,该类不受容器管理。我可以从JNDI获得参考吗?有什么方法吗?
由于
答案 0 :(得分:2)
首先,您需要声明持久性单元/上下文引用。如果要使用@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");
请注意,查找必须在声明的引用的 context 中执行。例如,如果您的servlet调用另一个使用JPA的类,那么您需要在web.xml中声明引用(或者注释一个servlet类)。如果您的servlet调用一个调用另一个使用JPA的类的EJB,那么您需要在ejb-jar.xml中为该EJB声明引用(或者注释EJB)。
答案 1 :(得分:0)
EntityManager em = (EntityManager) new InitialContext().lookup("java:comp/env/persistence/em");
答案 2 :(得分:0)
EntityManagerFactory factory = Persistence.createEntityManagerFactory("persistenceUnitName");
EntityManager entityManager = factory.createEntityManager();
我测试了它并且有效。