Java Persistence API (JPA) 是 Java EE 的一部分,它是一种 Java Object-Relational Mapping (ORM) 框架,为 Java 开发者提供了一种将 Java 对象映射到关系数据库的方法。其中需要注意的一个关键的配置文件就是 persistence.xml,它是 JPA 的配置文件,本文将会介绍该文件的内容和语法,以及如何使用它来访问和管理数据库。
一、persistence.xml的基本结构
persistence.xml 是一个 XML 文件,需要放置在 Java 项目的 src/main/resources/META-INF 目录下,它包含了 JPA 中的所有配置信息。以下是一个标准的 persistence.xml 文件的基本结构:
```xml
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0">
```
- persistence: 根元素,指定了 XML 文件的命名空间,XML 的版本和 JPA 的命名空间。
- persistence-unit: JPA 的一个单元,必须指定名字,transaction-type 官方只提供了两种类型,一个是 JTA,另一个是 RESOURCE_LOCAL。
二、persistence.xml的参数配置
在 persistence.xml 文件中,还需要配置一些参数,以便于连接数据库,进行一系列操作。下面我们将会介绍一些常用的参数配置,并给出相关的实例:
1. Provider
定义了使用哪一个 JPA 规范的实现提供者,默认情况下,Hibernate 是最常见的 JPA 实现提供者。对于 Hibernate 来说,provider 的值应该为 org.hibernate.jpa.HibernatePersistenceProvider。而如果可以使用 EclipseLink,它的 provider 值应该为 org.eclipse.persistence.jpa.PersistenceProvider。
```xml
```
2. JPA 实体类的位置
在 persistence.xml 文件中,需要指定 JPA 实体类所在的位置。假设 JPA 实体类都在 com.example.entity 包之下,则配置代码如下:
```xml
```
若有多个,可以使用逗号分隔开,例如:
```xml
```
3. 数据库连接
在 persistence.xml 中,需要配置数据库连接的相关参数,包括连接 URL、账号和密码等。
```xml
```
这里的 name 属性均是固定名称,value 表示具体配置的参数值。
4. 是否自动创建、更新表
如果希望在应用启动时完成表的创建和更新操作,可以设置 hibernate.hbm2ddl.auto 参数。该参数有以下几个值:
- create: 创建表,如果表已存在,则先删除之前的,再重新创建。
- create-drop: 创建表,应用退出时删除表。
- update: 更新表,如果表不存在则创建。
- validate: 验证表结构是否合法,如果不合法,则抛出异常。
例如,设置自动创建表可使用以下配置:
```xml
```
5. 清除缓存
在持久化数据过程中,为了减少查询数据库的次数,可以考虑将数据进行缓存。缓存的目的是在获得大量数据时,减少数据库查询的次数,更好地提高性能。 p.persistence.xml 文件中,可以设置 hibernate.cache.use_second_level_cache 参数来开启缓存。例如:
```xml
```
其它缓存相关的配置项包括:
- hibernate.cache.region.factory_class: 为缓存提供工厂类;
- hibernate.cache.use_query_cache: 是否使用查询缓存。
三、persistence-unit 的各种属性参数配置解释:
从上文示例中可以看出,persistence.xml 文件中的重要组成部分是 persistence-unit 标签。该标签的返回值为 EntityManagerFactory 实例,EntityManagerFactory 是创建 EntityManager 的工厂类。
persistence-unit 标签支持如下参数:
1. name
名称作为唯一标识符。当该标签包含在 persistence.xml 文件中时必须指定该名称;
2. transaction-type
事务类型可取值为:
- JTA: 此时事务由容器(如 Tomcat 等)负责管理,可以使用 JNDI 等方式连接数据源。
- RESOURCE_LOCAL:此时事务由程序控制,不能使用 JNDI 方式连接数据源,需要配置 URL、数据库驱动和用户名密码等信息。
3. jta-data-source
当 transaction-type 取值为 JTA 时,需要指定 JNDI 数据源。例如:
```xml
```
4. non-jta-data-source
当 transaction-type 取值为 RESOURCE_LOCAL 时,需要指定应用与之相关联的数据源。例如:
```xml
```
5. provider
指定 JPA 的提供者。例如:
```xml
```
6. exclude-unlisted-classes
是否引入指定的实体类。默认情况下,JPA 会引入所有与 persistence-unit 标签在同一包下的所有实体类。当 exclude-unlisted-classes 的值为 true 时,则只会引入已经被列举出来的实体类。
7. shared-cache-mode
配置缓存的使用选项。可取值为:
- NONE: 不使用缓存;
- ALL: 所有实体都将使用缓存;
- ENABLE_SELECTIVE: 只有被标记为 @Cacheable 的实体才会被缓存。
8. validation-mode
指定实体类是否需要验证。可取值为:
- AUTO: 自动验证,如果实体类使用 Hibernate Validator,则会自动验证。
- CALLBACK: 仅调用实体类中定义的回调函数。用户需要自己在实体类中实现回调函数。
- NONE: 不验证实体类。
四、对persistence.xml文件的使用
在使用 Hibernate 时,通常的做法是在数据库中创建一个 schema 或者 data base,与此同时实体类就会自动生成在数据库中。这部分可以使用 Hibernate 的 hibernate.hbm2ddl.auto 参数帮助我们解决,其设置方式使用的就是前面提到的 persistence.xml 的内容:
```xml
```
创建之后,在实体类上添加注解来实现数据库表与 Java 类的映射关系。
例如,我们可以用以下注解来实现 User 的映射:
```java
@Entity
@Table(name = "t_user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "username")
private String username;
@Column(name = "password")
private String password;
@Column(name = "email")
private String email;
}
```
以上实例中,@Entity 表示该类是实体类,@Table 指明了对应的数据库表,@Id 指明了主键属性,@GeneratedValue 定义主键生成策略为 IDENTITY 字段自增长,@Column 表示字段的映射。
接下来,将使用 EntityManager 的实现类 EntityManagerFactory 来建立与数据库之间的连接,并进行简单的 CRUD 操作。其中需要注意的是,EntityManager 的实现类 EntityManagerFactory 常用于初始化 EntityManager,代码如下:
```java
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("PU_NAME");
EntityManager entityManager = entityManagerFactory.createEntityManager();
```
这与使用 SessionFactory 来生成 Session 的方式类似。entityManager.close() 方法可以用于结束大量的数据库查询操作。这种方式跟使用 JDBC 进行数据库操作的方法有很大的不同,因为它让操作变得更加的面向对象,具体示例如下:
```java
// 向数据库中添加 User 和 Blog (只创建 MyUser 还是会创建 MyBlog,表中不包含对应字段的 USER_ID 与 BLOG_ID,但是实体类是有的)
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("PU_NAME");
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
User user = new User();
user.setUsername("ylf");
user.setPassword("123");
user.setEmail("ylf@gmail.com");
Blog blog = new Blog();
blog.setTitle("My blog");
blog.setContent("This is my blog.");
entityManager.persist(user);
entityManager.persist(blog);
entityManager.flush();
entityManager.getTransaction().commit();
// 从数据库中查询所有 User
entityManager.getTransaction().begin();
List
for (User u : userList) {
System.out.println(u.toString());
}
entityManager.getTransaction().commit();
```
上述代码中,我们从数据库中查询了所以 User,使用了 JPA 自带的 HQL 语句进行查询,效果与之前的 SQL 语句相同。最后,执行 EntityManager 的 flush 方法,将操作刷新到数据库中。
五、总结
persistence.xml 是 Java Persistence API 中非常重要的配置文件,它用于设置 JPA 的各种参数,连接数据库,并进行 CRUD 操作。在使用它时,需要了解它的各种参数以及如何配置,也需要了解 EntityManagerFactory 的使用以及如何使用 HQL 语句进行查询操作。这些都是 JPA 中非常重要的内容,希望本文能够对使用者有所帮助。