我正在开发一个使用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,但保持事务语义。
答案 0 :(得分:0)
此处详细介绍了Wildfly特定的解决方案:
https://docs.jboss.org/author/display/WFLY8/JPA+Reference+Guide#JPAReferenceGuide-BindingEntityManagerFactory%2FEntityManagertoJNDI。按照链接中描述的步骤操作后,您应该能够通过JNDI(EntityManager
)获取对NamingContext.lookup()
的引用。
我仍然有一种明显的感觉,你有一个XY问题。您的评论会增加混乱,因为我正在使用JPA'和使用该库的应用据说不了解JPA'相互排斥。此外,还有一个持久性单元名称,恰好在一个案例中用JPA实现了#39;因为持久性单元是JPA特有的概念,所以具有误导性。
我无法理解您为什么不能将所有数据源静态列出为生产者'但是,一个全球性的,应用程序范围的实体管理员'可以正常工作。持久性单位是否在persistence.xml
中没有静态列出?我希望上面的链接适合您,但如果您在问题中添加示例用例,我可以尝试建议一个更好的解决方案,如果您愿意。