如何为 JPA 和 Hibernate 创建一个 persistence.xml 文件?

Posted

技术标签:

【中文标题】如何为 JPA 和 Hibernate 创建一个 persistence.xml 文件?【英文标题】:How do I create a persistence.xml file for JPA and Hibernate? 【发布时间】:2011-11-07 06:45:38 【问题描述】:

我正在尝试使用 Hibernate JPA,但我需要创建我的 persistence.xml(这样我才能正确使用实体管理器)。我不确定要创建什么以及放置它的位置。

这就是我的 hibernate.cfg.xml 在“核心”模式下的配置方式。 我正在使用 Eclipse Java EE IDE Web Developers (Indigo Release):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.password">XXXXXX</property>
        <property name="hibernate.connection.url">jdbc:mysql://<hostname>/<database></property>
        <property name="hibernate.connection.username">XXXXX</property>
        <property name="hibernate.default_schema">XXXXXX</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    </session-factory>
</hibernate-configuration>

【问题讨论】:

您在 Eclipse 中创建了什么样的项目?它是一个 JPA 项目吗?如果您创建了一个 JPA 项目,它应该有一个 persistence.xml 文件。 @Vineet Reynolds,我的项目是 Eclips Web Java EE Developers 中的一个动态 Web 项目,我没有找到任何 persistence.xml 文件。 这篇文章帮帮我:***.com/questions/703043/… 【参考方案1】:

创建一个位于 META-INF 文件夹中的 persistence.xml 文件。

例子:

<persistence 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"
         version="2.0">
<persistence-unit name="sample">
  <provider>org.hibernate.ejb.HibernatePersistence</provider>
  <jta-data-source>java:/DefaultDS</jta-data-source>
  <mapping-file>ormap.xml</mapping-file>
  <jar-file>MyApp.jar</jar-file>
  <class>org.acme.Employee</class>
  <class>org.acme.Person</class>
  <class>org.acme.Address</class>
  <properties>
     <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
     <property name="hibernate.connection.password">XXXXXX</property>
     <property name="hibernate.connection.url">jdbc:mysql://<hostname>/<database></property>
     <property name="hibernate.connection.username">XXXXX</property>
     <property name="hibernate.default_schema">XXXXXX</property>
     <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
   </properties>
  </persistence-unit>
</persistence>

【讨论】:

另一个选项是在 Spring 的配置中设置 packagesToScan 属性,如下所示: <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"><property name="dataSource" ref="dataSource"></property><property name="packagesToScan"><list><value>be.webworks.webshop.service.infra.persistence</value></list> property&gt; </property></bean> 那么你不需要保持一个 persistence.xml 是最新的或者每次都生成它。 xsd 中似乎需要属性“值”,您确定此示例正确吗? @KorayTugay 这个答案比您的评论早三年。他们更改了标签的语法,因此现在需要该值。 :) &lt;property name="javax.persistence.schema-generation.database.action" value="create" /&gt; 为例。【参考方案2】:

JPA 持久性 XML 文件位置

传统上,persistence.xml 位于 META-INF 文件夹中,该文件夹需要驻留在 Java 类路径的根目录中。如果您使用的是 Maven,可以将其存储在 resources 文件夹中,如下所示:

src/main/resources/META-INF/persistence.xml

JPA 持久性 XML 文件结构

`persistence.xml 配置文件结构如下:

<?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 元素,它定义了用于验证 persistence.xml 配置文件的 JPA 版本和 XML 模式。

持久性单元

persistence-unit 元素定义了关联的 JPA 持久性单元的名称,您以后可以在使用 @PersistenceUnit JPA 注释注入关联的 EntityManagerFactory 实例时使用它来引用它:

@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,您需要显式选择JtaTranscationManager Spring bean。

说明

description 元素允许您提供有关当前持久性单元目标的更多详细信息。

提供者

provider XML 元素定义了实现 JPA PersistenceProvider 接口的完全限定类名。

如果您使用的是 Hibernate 4.3 或更新版本,则需要使用 org.hibernate.jpa.HibernatePersistenceProvider 类名。

如果您使用的是 Hibernate 4.2 或更早版本,则需要改用 org.hibernate.ejb.HibernatePersistence 类名。

jta 数据源和非 jta 数据源

JPA 规范定义两个不同的 XML 标记来提供 JNDI DataSource 名称是非常不寻常的。应该有一个 data-source 属性,因为 transaction-type 已经指定是否使用 JTA。

不,如果您使用的是 JTA,您可以使用 jta-data-source 为关联的 JTA DataSource 指定 JNDI 名称,而对于 RESOURCE_LOCAL,您需要使用 non-jta-data-source

如果您使用的是 Hibernate,还可以使用 hibernate.connection.datasource 配置属性来指定要使用的 JDBC DataSource

属性

properties 元素允许您定义要配置的 JPA 或 JPA 提供者特定的属性:

休眠Dialect JTA 交易平台(例如 GlassFish、JBoss、Bitronix、Atomikos) 是否应自动生成数据库架构 Hibernate 是否应该skip the auto-commit check for RESOURCE_LOCAL transactions activate the slow SQL query log 您可以在org.hibernate.cfg.AvailableSettings 界面中找到更多属性。

实体映射设置

默认情况下,Hibernate 能够根据 @Entity 注释的存在来查找 JPA 实体类,因此您无需声明实体类。

排除未列出的类

但是,如果要显式设置要使用的实体类,并排除在当前 Java 类路径中找到的任何其他实体类,则需要将 exclude-unlisted-classes 元素设置为 true 的值:

<exclude-unlisted-classes>true</exclude-unlisted-classes>
班级

上面设置exclude-unlisted-classes XML元素后,需要通过class XML元素指定当前Persistence Unit注册的实体类列表:

<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 文件夹中。如果要使用不同的文件位置,可以使用persistence.xml 文件中的mapping-file XML 元素,如下所示:

<mapping-file>file:///D:/Vlad/Work/Examples/mappings/orm.xml</mapping-file>
jar 文件

默认情况下,JPA 提供程序将扫描当前 Java 类路径以加载实体类或 XML 映射。如果要提供一个或多个 JAR 文件进行扫描,可以使用 jar-file 元素,如下所示:

<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 元素时使用的默认值。

您还可以使用javax.persistence.cache.storeMode 属性以编程方式覆盖shared-cache-mode 策略,如下所示:

EntityManagerFactory entityManagerFactory = Persistence
.createEntityManagerFactory(
    "HypersistenceOptimizer", 
    Collections.singletonMap(
        "javax.persistence.cache.storeMode",
        SharedCacheMode.ENABLE_SELECTIVE
    )
);

验证模式

validation-mode XML 元素指定了ValidationMode 策略,该策略指示 JPA 提供者是否应在运行时检查实体 Bean 验证。

validation-mode 元素可以采用以下值:

AUTO - 如果在当前 Java 类路径中找到 Bean Validation 提供程序,它将自动注册,并且所有实体都将被验证。如果未找到 Bean Validation 提供程序,则不会验证实体。这是默认值。 CALLBACK - 实体必须始终由 Bean 验证提供程序进行验证。如果 JPA 提供程序没有在类路径上找到 Bean Validation 实现,则引导过程将失败。 NONE - 即使在类路径中找到 Bean Validation 提供程序,也不会验证实体。

您还可以使用javax.persistence.validation.mode 属性以编程方式覆盖validation-mode 策略,如下所示:

EntityManagerFactory entityManagerFactory = Persistence
.createEntityManagerFactory(
    "HypersistenceOptimizer", 
    Collections.singletonMap(
        "javax.persistence.validation.mode",
        ValidationMode.CALLBACK
    )
);

【讨论】:

以上是关于如何为 JPA 和 Hibernate 创建一个 persistence.xml 文件?的主要内容,如果未能解决你的问题,请参考以下文章

JPA/Hibernate:如何为 @ManyToOne 插入默认值,其中值表示空条目

如何用 JPA/Hibernate 映射 XMLType

如何为 EntityManagerFactory 设置 Hibernate 拦截器

JPA的XML生成(JAXB)和数据库视图

如何为连接表中的其他属性创建多对多 Hibernate 映射?

如何在 Hibernate/JPA 中使用 Java 8 Date 库? [复制]