【问题标题】:getting EntityManager from an unmanaged class从非托管类中获取 EntityManager
【发布时间】:2013-07-11 11:00:43
【问题描述】:

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

谢谢

【问题讨论】:

    标签: jakarta-ee jpa ejb


    【解决方案1】:

    首先,您需要声明一个持久性单元/上下文引用。如果您想使用@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)。

    【讨论】:

      【解决方案2】:
      EntityManager em = (EntityManager) new InitialContext().lookup("java:comp/env/persistence/em");
      

      【讨论】:

      • 已经试过了。返回 null,因为该类不由容器管理。
      • @MikeArgyriou 不,它为空,因为您指定了不正确的 JNDI 查找字符串。
      • 在任何情况下,失败的查找都不应该返回 null。
      【解决方案3】:
      EntityManagerFactory factory = Persistence.createEntityManagerFactory("persistenceUnitName");
      EntityManager entityManager =  factory.createEntityManager();
      

      我测试了它,它可以工作。

      source

      【讨论】:

      • 请注意,虽然这似乎可行,但创建单独的 EntityManagerFactory 的危险在于它与容器创建和管理的默认工厂不同。因此,诸如 NamedQueries 之类的内容将不可见,并且托管实体可能会有所不同并启用脏操作。
      猜你喜欢
      • 2016-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      相关资源
      最近更新 更多