6.9. 使用 Java™ 持久性 API 的数据源


从事务管理的角度来看,了解数据源与 Java™ Persistence API(JPA)搭配使用非常重要。本节不描述 JPA 规格本身的详情,以及 Hibernate 的更多详情,这是最已知的 JPA 实施。本节演示了如何将 JPA 持久单元指向数据源。

6.9.1. 关于数据源引用

META-INF/persistence.xml 描述符(请参阅 JPA 2.1 规格 8.2.1.5 jta-data-source)定义两种数据源引用:

  • <JTA-data-source > - 这是对启用了 JTA 的数据源的 JNDI 引用,用于 JTA 事务。
  • <non-jta-data-source > - 这是对启用了 JTA 的数据源的 JNDI 引用,可在 JTA 事务之外使用。此数据源通常用于初始化阶段,例如使用 hibernate.hbm2ddl.auto 属性将 Hibernate 配置为自动创建数据库架构。

这两个数据源与 javax.sql.DataSourcejavax.sql.XADataSource 无关!这是开发 JPA 应用程序时常见的误解。两个 JNDI 名称都必须引用 JNDI 绑定 javax.sql.DataSource 服务。

6.9.2. 参考 JNDI 名称

当您使用 osgi.jndi.service.name 属性注册 OSGi 服务时,它已在 OSGi JNDI 服务中 绑定。在 OSGi 运行时(如 Fuse/Karaf)中,JNDI 不是 name value 对的简单字典。通过 OSGi 中的 JNDI 名称引用对象,涉及服务查找和其他更复杂的 OSGi 机制,如服务 hook。

在全新的 Fuse 安装中,以下列表显示了在 JNDI 中注册数据源的方式:

karaf@root()> install -s mvn:mysql/mysql-connector-java/5.1.34
Bundle ID: 223
karaf@root()> install -s mvn:org.osgi/org.osgi.service.jdbc/1.0.0
Bundle ID: 224
karaf@root()> install -s mvn:org.ops4j.pax.jdbc/pax-jdbc-mysql/1.3.0
Bundle ID: 225
karaf@root()> install -s mvn:org.ops4j.pax.jdbc/pax-jdbc/1.3.0
Bundle ID: 226
karaf@root()> install -s mvn:org.ops4j.pax.jdbc/pax-jdbc-pool-common/1.3.0
Bundle ID: 227
karaf@root()> install -s mvn:org.ops4j.pax.jdbc/pax-jdbc-config/1.3.0
Bundle ID: 228

karaf@root()> config:edit --factory --alias mysql org.ops4j.datasource
karaf@root()> config:property-set osgi.jdbc.driver.name mysql
karaf@root()> config:property-set dataSourceName mysqlds
karaf@root()> config:property-set osgi.jndi.service.name jdbc/mysqlds
karaf@root()> config:property-set dataSourceType DataSource
karaf@root()> config:property-set jdbc.url jdbc:mysql://localhost:3306/reportdb
karaf@root()> config:property-set jdbc.user fuse
karaf@root()> config:property-set jdbc.password fuse
karaf@root()> config:property-set jdbc.useSSL false
karaf@root()> config:update

karaf@root()> feature:install jndi

karaf@root()> jndi:names
JNDI Name                 │ Class Name
──────────────────────────┼───────────────────────────────────────────────
osgi:service/jndi         │ org.apache.karaf.jndi.internal.JndiServiceImpl
osgi:service/jdbc/mysqlds │ com.mysql.jdbc.jdbc2.optional.MysqlDataSource

如您所见,数据源位于 osgi:service/jdbc/mysqlds JNDI 名称下。

但是,如果 OSGi 中的 JPA,您必须使用 完整的 JNDI 名称。以下是指定数据源参考的 META-INF/persistence.xml 片段示例:

<jta-data-source>
    osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/mysqlds)
</jta-data-source>
<non-jta-data-source>
    osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/mysqlds)
</non-jta-data-source>

如果没有上述配置,您可能会得到这个错误:

Persistence unit "pu-name" refers to a non OSGi service DataSource
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.