6.9. 将数据源与 Java™ 持久性 API 搭配使用
从事务管理的角度来看,了解数据源如何与 Java™ Persistence API (uildDefaults)搭配使用。本小节并不描述了 JPA 规范本身的详细信息,也没有有关 Hibernate 的详细信息,这是最已知的 JPA 实施。相反,本节演示了如何将 JPA 持久单位指向数据源。
6.9.1. 关于数据源引用
META-INF/persistence.xml
描述符(请参阅 JPA 2.1 规格 8.2.1.5 jta-data-source, non-jta-data-source)定义了两种数据源引用:
-
<JTA-data-source
> - 这是对支持 JTA 事务的JTA
数据源的 JNDI 引用。 -
<non-jta-data-source
> - 这是对支持 JTA 事务外的JTA
数据源的引用。此数据源通常也用于初始化阶段,例如,使用hibernate.hbm2ddl.auto
属性将 Hibernate 配置为自动创建数据库 schema。
这两个数据源与 javax.sql.DataSource
或 javax.sql.XADataSource
! 这是开发 JPA 应用程序时常见的误解。这两个 JNDI 名称都必须引用 JNDI-bound 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 名称下。
但是,如果将 JPA 在 OSGi 中,您必须使用 完整的 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