Java Enterprise Edition(Java EE)平台提供了一种称为JPA(Java Persistence API)的持久性技术,该技术在管理应用程序数据的同时还提供了一些强大的功能,例如对象- 关系映射(ORM)、事务管理和查询语言等。Java应用程序在使用JPA时会涉及到持久化单元(Persistence Unit)的配置,而这个配置文件就是persistence.xml。
persistence.xml是Java EE应用程序中使用JPA持久性技术时所必须的一个配置文件。这个文件位于应用程序的META-INF目录下,是一个XML文件,其定义了JPA实体管理器如何访问数据源,以及如何映射实体对象到数据库中的表。通常,persistence.xml文件是由开发人员根据应用程序的需求进行手动配置的。
在JPA应用程序中,持久化单元负责与数据源交互,在访问持久化单元之前,persistence.xml文件必须存在于应用程序的CLASSPATH下,这样JPA实体管理器才能读取它。这个文件中包含了许多元素,负责定义JPA的实体管理器工厂实例,并决定如何加载Java类和XML映射文件。接下来我们将对其中的一些重要元素进行深入解析。
首先,我们来看persistence元素,它是persistence.xml文件的根元素,定义了持久化单元的配置。其必须包含一个名为“name”的属性,该属性指定了持久单元的名称。
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence"
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">
<persistence-unit name="shop">
...
</persistence-unit>
</persistence>
接下来,我们来看persistence-unit元素,它是persistence.xml文件中重要的元素。它定义了一个持久化单元,该单元定义了管理实体的一系列设置。持久化单元由一个名称“name”来标识,并且需要一个标识符“transaction-type”。
<persistence-unit name="shop"
transaction-type="RESOURCE_LOCAL">
...
</persistence-unit>
在transaction-type属性中,必须指定一个值,以告诉JPA实现如何在应用程序的事务上下文中管理实体的生命周期。RESOURCE_LOCAL表明使用JPA的本地事务,而JTA则表示使用Java事务API。本文不对JTA做具体讨论,我们只研究RESOURCE_LOCAL。
接下来,我们需要指定JPA实现如何与数据源建立连接。这个可以通过resource-local或jta-data-source元素完成。这里我们将考虑resource-local,随后再讨论jta-data-source。在RESOURCE_LOCAL情况下,我们需要指定JDBC驱动程序的类名、URL、用户名和密码等信息,例如:
<persistence-unit name="shop"
transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>com.example.Shopping</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:shop" />
<property name="javax.persistence.jdbc.user" value="sa" />
<property name="javax.persistence.jdbc.password" value="" />
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
</properties>
</persistence-unit>
这个例子给出了使用H2数据库作为数据源的持久化单元的完整配置信息。其中,javax.persistence.jdbc.driver、javax.persistence.jdbc.url、javax.persistence.jdbc.user和javax.persistence.jdbc.password是必要的JDBC连接属性配置。此外,还将指定JPA实现使用的Hibernate方言,以便可以为Hibernate生成符合数据库的SQL语句。
除了配置JDBC连接信息外,持久化单元还允许我们定义实体映射。这可以通过class、jar-file和mapping-file元素来实现:
<persistence-unit name="shop"
transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>com.example.Shopping</class>
<jar-file>myclasses.jar</jar-file>
<mapping-file>product-mapping.xml</mapping-file>
<properties>
...
</properties>
</persistence-unit>
在class元素中,我们可以为应用程序中的一个Java类定义一个实体映射。jar-file元素允许我们为应用程序中的一个Java jar文件定义一个实体映射。mapping-file元素允许我们使用XML文件来表示实体映射。这些元素的使用在一起可以为我们提供极高的灵活性。
如果我们使用的是全局 JNDI 数据源,我们需要使用 jta-data-source 元素来指定数据源,例如:
<persistence-unit name="shop"
transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>jdbc/shopDB</jta-data-source>
<class>com.example.Shopping</class>
<properties>
...
</properties>
</persistence-unit>
以上是persistence.xml中最常见的几个元素,它们的组合和配置能够为JPA实现提供最大的灵活性,从而管理应用程序的数据。熟练地配置持久化单元可以让我们更加充分地利用JPA技术,并减少在应用程序开发的过程中遇到的问题。因此,充分了解persistence.xml对于Java开发人员来说是至关重要的。
最后,简单总结一下:
1. persistence.xml是Java EE应用程序中使用JPA持久化技术时所必须的一个配置文件,用于定义JPA实体管理器如何访问数据源,以及如何将实体对象映射到数据库表。
2. persistence-unit元素是persistence.xml文件中重要的元素,定义了一个持久化单元,该单元定义了管理实体的一系列设置。
3. 在persistence.xml中,我们需要指定JPA实现如何与数据源建立连接,并可以定义实体映射。
4. 了解和充分配置persistence.xml能够帮助Java开发人员更充分地利用JPA技术,并减少在应用程序开发的过程中遇到的问题。