介绍
在本文中,我将解释 JPA persistence.xml
配置文件的用途,以及如何使用可用的 XML 标记或属性设置 Java Persistence 应用程序。
虽然 Spring 应用程序可以在不需要 XML JPA 配置文件的情况下进行引导,但理解每个配置选项的含义仍然很重要,因为 Spring 在构建 Java PersistenceLocalContainerEntityManagerFactoryBean
或 Hibernate-specific时还提供了另一种方法LocalSessionFactoryBean
。
持久性单元
persistence.xml
配置文件用于配置给定的 JPA 持久性单元。Persistence Unit 定义了引导所需的所有元数据EntityManagerFactory
,例如实体映射、数据源和事务设置,以及 JPA 提供程序配置属性。
的目标EntityManagerFactory
是用于创建EntityManager
我们可以用于实体状态转换的对象。
因此,persistence.xml
配置文件定义了引导 JPA 所需的所有元数据EntityManagerFactory
。
JPA 持久性 XML 文件位置
传统上,persistence.xml
它位于META-INF
需要驻留在 Java 类路径根目录中的文件夹中。如果您使用的是 Maven,则可以将其存储在resources
文件夹中,如下所示:
src/main/resources/META-INF/persistence.xml
|
JPA 持久性 XML 文件结构
配置persistence.xml
文件结构如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
<? xml version = "1.0" encoding = "UTF-8" ?>
< persistence version = "2.2"
xmlns = "http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
< persistence-unit
name = "HypersistenceOptimizer"
transaction-type = "JTA" >
< description >
Hypersistence Optimizer is a dynamic analyzing tool that can scan
your JPA and Hibernate application and provide you tips about the
changes you need to make to entity mappings, configurations, queries,
and Persistence Context actions to speed up your data access layer.
</ description >
< provider >org.hibernate.jpa.HibernatePersistenceProvider</ provider >
< jta-data-source >java:global/jdbc/default</ jta-data-source >
< properties >
< property
name = "hibernate.transaction.jta.platform"
value = "SunOne"
/>
</ properties >
</ persistence-unit >
</ persistence >
|
标签是根persistence
XML 元素,它定义了 JPA 版本和用于验证persistence.xml
配置文件的 XML 模式。
持久性单元
该元素定义了关联的 JPA 持久性单元的名称,稍后您可以在使用JPA 注释注入关联的实例persistence-unit
时使用它来引用它:@PersistenceUnit
EntityManagerFactory
1
2
|
@PersistenceUnit (name = "HypersistenceOptimizer" )
private EntityManagerFactory entityManagerFactory;
|
该transaction-type
属性定义了 JPA 事务策略,它可以采用以下两个值之一:
JTA
RESOURCE_LOCAL
传统上,Java EE 应用程序默认使用 JTA,这需要一个使用 2PC(两阶段提交)协议的 JTA 事务管理器以原子方式将更改应用于多个数据源(例如,数据库系统、JMS 队列、缓存)。
如果要将更改传播到单个数据源,则不需要 JTA,因此RESOURCE_LOCAL
事务类型是一种更有效的替代方案。例如,默认情况下,Spring 应用程序使用RESOURCE_LOCAL
事务,并且要使用JTA
,您需要显式选择JtaTransactionManager
Spring bean。
描述
该description
元素允许您提供有关当前持久性单元目标的更多详细信息。
提供者
XML 元素定义了实现 JPA接口的provider
全限定类名。PersistenceProvider
如果您使用的是 Hibernate 4.3 或更新版本,则需要使用
org.hibernate.jpa.HibernatePersistenceProvider
类名。如果您使用的是 Hibernate 4.2 或更早版本,则需要使用
org.hibernate.ejb.HibernatePersistence
类名。
jta 数据源和非 jta 数据源
JPA 规范定义两个不同的 XML 标记来提供 JNDIDataSource
名称是非常不寻常的。应该有一个data-source
属性,因为transaction-type
已经指定是否使用 JTA。
不,如果您使用的是 JTA,您可以使用jta-data-source
为关联的 JTA 指定 JNDI 名称DataSource
,而对于RESOURCE_LOCAL
,您需要使用non-jta-data-source
.
如果您使用的是 Hibernate,您还可以使用
hibernate.connection.datasource
配置属性来指定DataSource
要使用的 JDBC。
特性
该properties
元素允许您定义要配置的 JPA 或 JPA 提供程序特定的属性:
- 冬眠者
Dialect
- JTA 交易平台(例如 GlassFish、JBoss、Bitronix、Atomikos)
- 是否应该自动生成数据库模式
- Hibernate 是否应该跳过对 RESOURCE_LOCAL 事务的自动提交检查
- 激活慢SQL查询日志
org.hibernate.cfg.AvailableSettings
以及您可以在界面中找到的更多属性。
实体映射设置
默认情况下,Hibernate 能够根据@Entity
注解的存在来查找 JPA 实体类,因此您无需声明实体类。
排除未列出的类
但是,如果要显式设置要使用的实体类,并排除在当前 Java 类路径中找到的任何其他实体类,则需要将exclude-unlisted-classes
元素设置为以下值true
:
1
|
< exclude-unlisted-classes >true</ exclude-unlisted-classes >
|
班级
设置好exclude-unlisted-classes
上面的 XML 元素后,需要通过 XML 元素指定当前 Persistence Unit 注册的实体类列表class
:
1
2
3
4
|
< class >io.hypersistence.optimizer.forum.domain.Post</ class >
< class >io.hypersistence.optimizer.forum.domain.PostComment</ class >
< class >io.hypersistence.optimizer.forum.domain.PostDetails</ class >
< class >io.hypersistence.optimizer.forum.domain.Tag</ class >
|
绝大多数 JPA 和 Hibernate 应用程序使用注释来构建对象关系映射元数据。但是,即使您正在使用注解,您仍然可以使用 XML 映射将静态注解元数据覆盖为通过orm.xml
配置文件提供的元数据。
例如,您可以在默认情况下使用注解使用SEQUENCE标识符生成器
@SequenceGenerator
,并将其替换IDENTITY
为 MySQL,它不支持数据库序列。有关此主题的更多详细信息,请查看这篇文章。
映射文件
默认情况下,orm.xml
配置文件位于META-INF
文件夹中。如果要使用不同的文件位置,可以使用文件mapping-file
中的 XML 元素persistence.xml
,如下所示:
1
|
< mapping-file >file:///D:/Vlad/Work/Examples/mappings/orm.xml</ mapping-file >
|
有关使用外部
orm.xml
文件以 XML 格式提供 JPA 映射的更多详细信息,请查看这篇文章。
jar 文件
但默认情况下,JPA 提供程序将扫描当前 Java 类路径以加载实体类或 XML 映射。如果要提供一个或多个要扫描的 JAR 文件,可以使用该jar-file
元素,如下所示:
1
|
< jar-file >lib/hypersistence-optimizer-glassfish-hibernate-example.jar</ jar-file >
|
共享缓存模式
该shared-cache-mode
元素允许您定义在SharedCacheMode二级缓存中存储实体的策略,它可以采用以下值之一:
ALL
– 将所有实体存储在二级缓存中,NONE
– 实体不存储在二级缓存中,ENABLE_SELECTIVE
– 默认情况下不缓存任何实体,除了@Cacheable(true)
标注注释的实体,这些实体将被缓存DISABLE_SELECTIVE
- 默认情况下所有实体都被缓存,除了带有@Cacheable(false)
注释的实体UNSPECIFIED
– 使用 JPA 提供程序默认缓存策略。shared-cache-mode
这也是未设置元素时使用的默认值。
您还可以使用该属性以shared-cache-mode
编程方式覆盖策略,如下所示:javax.persistence.cache.storeMode
1
2
3
4
5
6
7
8
|
EntityManagerFactory entityManagerFactory = Persistence
.createEntityManagerFactory(
"HypersistenceOptimizer" ,
Collections.singletonMap(
"javax.persistence.cache.storeMode" ,
SharedCacheMode.ENABLE_SELECTIVE
)
);
|
验证模式
validation-mode
XML 元素指定策略,该ValidationMode策略指示 JPA 提供者是否应在运行时检查实体 Bean Validation。
该validation-mode
元素可以采用以下值:
AUTO
– 如果在当前 Java 类路径中找到 Bean Validation 提供程序,它将自动注册,并且所有实体都将被验证。如果未找到 Bean Validation 提供程序,则不会验证实体。这是默认值。CALLBACK
– 实体必须始终由 Bean Validation 提供者进行验证。如果 JPA 提供者没有在类路径上找到 Bean Validation 实现,则引导过程将失败。NONE
– 即使在类路径中找到 Bean Validation 提供程序,也不会验证实体。
您还可以使用该属性以validation-mode
编程方式覆盖策略,如下所示:javax.persistence.validation.mode
1
2
3
4
5
6
7
8
|
EntityManagerFactory entityManagerFactory = Persistence
.createEntityManagerFactory(
"HypersistenceOptimizer" ,
Collections.singletonMap(
"javax.persistence.validation.mode" ,
ValidationMode.CALLBACK
)
);
|
结论
Java Persistence XML 配置文件允许您定义一个 Persistence Unit 配置,稍后您可以使用 Java EE 或 Spring 进行引导。
了解所有persistence.xml
文件配置选项非常重要,因为它可以让您解决各种各样的映射要求。