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.DataSource 或 javax.sql.XADataSource 无关!这是开发 JPA 应用程序时常见的误解。两个 JNDI 名称都必须引用 JNDI 绑定 javax.sql.DataSource 服务。
6.9.2. 参考 JNDI 名称 复制链接链接已复制到粘贴板!
当您使用 osgi.jndi.service.name 属性注册 OSGi 服务时,它已在 OSGi JNDI 服务中 绑定。在 OSGi 运行时(如 Fuse/Karaf)中,JNDI 不是 name
在全新的 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