【问题标题】:Using EntityManagerFactory from Persistence API从 Persistence API 使用 EntityManagerFactory
【发布时间】:2019-11-04 14:15:52
【问题描述】:

我想在 jee 环境中从 Persistence 接口获取 EntityManagerFactory 实例.. 但规范链接:https://docs.oracle.com/javaee/7/api/javax/persistence/Persistence.html

陈述如下

Persistence 类在 Java EE 容器环境中也可用;但是,容器环境中不需要支持 Java SE 引导 API。

这是否意味着我们不应该使用 Persistence.createEntityManagerFactory 而不是在 java EE 环境中使用?

注意:我已经在 WAS 8.5.5 和 JBOSS EAP 7 进行了测试,并且能够成功获取 EntityManagerFactory 并执行 DB 持久性。我想知道容器是否可以按照规范停止对这个 API 的支持?

【问题讨论】:

  • 我试图弄清规范。我很想知道投反对票的原因
  • 首先,“不需要”仅表示使用此 API 可能无法在 JavaEE 实现之间移植。通常你会@Inject 你的EntityManagerFactory,或者更好,只是一个EntityManager。
  • 嗨,史蒂夫,配置的数据源名称是动态的,我无法在 persistence.xml 中对其进行硬编码。为了能够使用 a.mappong 文件或自定义数据源查找,我需要动态设置它们,并且我可以使用 Persistence.createEntotyManagerFactory API 来实现这一点。此外,考虑到在部署环境中生成的动态数据源名称的变化,我不能选择维护多个 Persistence.xml。

标签: java jpa jakarta-ee persistence


【解决方案1】:

如果我正确理解您的 cmets,您的问题是数据源在某种程度上是动态的,因此您希望使用引导 API 创建您的 EntityManagerFactory,而不是通过您的 persistence.xml 配置它“EE 方式”

您的数据源究竟有多动态?你在运行什么 EE 容器?您可以在容器配置中(即在服务器上)配置数据源,并让您的 entitymanagerfactory 由容器创建或通过 JNDI 自动获取数据源。

在前任雇主处,我们运行 Wildfly,并在每台服务器上的 wildfly 配置中配置数据源,让 wildfly 在标准位置提供数据源,以供 hibernate 获取和构建 EMF。

有关类似设置的示例,请参阅 https://stackoverflow.com/a/41550908/691074

这使我们能够在连接到不同数据库(即测试、生产等)的不同服务器上运行相同的代码

默认的 wildfly 配置已经配置了一个内存 H2 数据库,您可以修改它以指向正确的方向。

Here 是 Wildfly 10 有关数据源配置的文档,here 是对 persistence.xml 的解释,其中包含引用容器管理的数据源的示例。

这对你的情况有用吗?

【讨论】:

  • 您好 Buurman,感谢您的回复和详细解释。
  • 我希望从这篇文章中获得的明确性是规范提到在 Java EE 环境中不需要支持引导。虽然目前 WAS 8.5 和 JBOSS EAP 7 支持这一点,但如果应用程序服务器可能会删除对 Persistence API 的支持,我们还需要注入实体管理器的其他替代方案。
  • 数据源配置为特定于区域,并根据我们部署应用程序的区域数量定义了许多数据源名称。这个数字可以增长,因此希望保持动态。我还提到了另一个 Stackover 流程​​帖子,它使用 jdbc/myDS 配置了 DS。问题是我将无法在编译期间预先设置 DS 名称。这将是动态的,Persistence API 提供了实现相同目标的灵活性。
  • 如果您在每个服务器的 wildfly 配置中配置数据源,您可以设置任何您想要的 jndi 名称。它与数据库连接无关,唯一的条件是您在任何地方都使用相同的名称(因此您可以使用运行时配置的数据源编译代码以构建实体管理器。在运行时 Wildfly 配置中,您可以使用配置数据源jdbc uri 和数据库名称随心所欲,唯一的要求是 jndi 名称应该是您在持久性 xml 中使用的名称,以便您的代码可以找到(注入)数据源。
  • 据我了解,您的问题应该可以作为解决方案。无论您是在服务器上配置数据源并注入它,还是配置诸如环境变量之类的东西(使用 jdbc uri 和用户名等)并按照您似乎想要的方式以编程方式构建数据源,如果您查看您的哪些信息,都是一样的需要在什么时候有空?只要您知道在运行时/在特定服务器上使用什么 jdbc uri 等来连接数据库,您就可以使用任一解决方案。
猜你喜欢
  • 2016-05-14
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
  • 2012-07-05
  • 2021-01-30
  • 2012-11-08
  • 1970-01-01
  • 2013-03-08
相关资源
最近更新 更多