首页 文章

以编程方式生成上下文管理的EntityManager

提问于
浏览
0

我正在开发一个使用JPA的JavaEE应用程序,并部署在JBoss / Wildfly上 . 我为JPA正确配置了 persistence.xmlstandalone.xml 以识别数据源 . 我知道获取上下文管理的EntityManager的常规方法如下:

@PersistenceContext(unitName = "foo")
EntityManager em;

但是,在我的用例中,定义数据源的应用程序和使用JPA访问它的库是分开的 . 我需要一种以其持久性单元名称以编程方式生成 EntityManager 的方法 . 我知道最简单的方法是:

Persistence.createEntityManagerFactory("foo").createEntityManager()

但是,这给了我一个应用程序管理实体管理器,它迫使我自己处理事务 . 我想获得一个上下文管理的实体管理器,我通过CDI注入 UserTransaction 或以类似的方式划分事务 . 有没有办法在运行时创建 EntityManager 并将其事务附加到当前上下文?

原始代码通过提供一个全局的,应用程序范围的实体管理器来解决这个问题 . 这样, EntityManager 的每次出现显然都具有相同的交易 . 除了其他问题,这会在尝试并行化查询时导致错误,因为 EntityManager 不是线程安全的 . 这就是为什么我目前正在尝试ad-hoc创建实体管理器实例,但保持事务语义 .

1 回答

  • 0

    此处详细介绍了Wildfly特定的解决方案:https://docs.jboss.org/author/display/WFLY8/JPA+Reference+Guide#JPAReferenceGuide-BindingEntityManagerFactory%2FEntityManagertoJNDI . 按照链接中描述的步骤操作后,您应该能够通过JNDI( NamingContext.lookup() )获取对 EntityManager 的引用 .

    我仍然有一种明显的感觉,你有一个XY问题 . 你的评论增加了混乱,因为语句“我正在使用JPA的JavaEE应用程序”和“使用库的应用程序据称不了解JPA”是相互排斥的 . 此外,'持久性单元名称,恰好在一种情况下使用JPA实现'具有误导性,因为持久性单元是JPA特有的概念 .

    我不明白为什么你只是静态列出所有数据源作为 生产环境 者' but '一个全局的,应用程序范围的entitymanager'作为一种解决方法正常工作 . 是否在_960541中没有静态列出持久性单位?我希望上面的链接适合您,但如果您在问题中添加示例用例,我可以尝试建议一个更好的解决方案,如果您愿意 .

相关问题