从非托管类获取EntityManager

时间:2013-07-11 11:00:44

标签: java-ee jpa ejb

如何从不是EJB的类中获取EntityManager?此外,该类不受容器管理。我可以从JNDI获得参考吗?有什么方法吗?

由于

3 个答案:

答案 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();

我测试了它并且有效。

source