我正在开发一个使用JPA的JavaEE应用程序,并部署在JBoss / Wildfly上 . 我为JPA正确配置了 persistence.xml
和 standalone.xml
以识别数据源 . 我知道获取上下文管理的EntityManager的常规方法如下:
@PersistenceContext(unitName = "foo")
EntityManager em;
但是,在我的用例中,定义数据源的应用程序和使用JPA访问它的库是分开的 . 我需要一种以其持久性单元名称以编程方式生成 EntityManager
的方法 . 我知道最简单的方法是:
Persistence.createEntityManagerFactory("foo").createEntityManager()
但是,这给了我一个应用程序管理实体管理器,它迫使我自己处理事务 . 我想获得一个上下文管理的实体管理器,我通过CDI注入 UserTransaction
或以类似的方式划分事务 . 有没有办法在运行时创建 EntityManager
并将其事务附加到当前上下文?
原始代码通过提供一个全局的,应用程序范围的实体管理器来解决这个问题 . 这样, EntityManager
的每次出现显然都具有相同的交易 . 除了其他问题,这会在尝试并行化查询时导致错误,因为 EntityManager
不是线程安全的 . 这就是为什么我目前正在尝试ad-hoc创建实体管理器实例,但保持事务语义 .
1 回答
此处详细介绍了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中没有静态列出持久性单位?我希望上面的链接适合您,但如果您在问题中添加示例用例,我可以尝试建议一个更好的解决方案,如果您愿意 .