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

时间:2018-01-08 17:36:12

标签: hibernate jpa transactions entitymanager jta

我正在开发一个使用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 :(得分: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中没有静态列出?我希望上面的链接适合您,但如果您在问题中添加示例用例,我可以尝试建议一个更好的解决方案,如果您愿意。