繁体   English   中英

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

[英]How do I create a persistence.xml file for JPA and Hibernate?

我正在尝试使用 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>

创建驻留在 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>

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

持久性单元

persistence-unit元素定义了关联的 JPA Persistence Unit 的名称,稍后您可以在使用@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 提供程序特定的属性:

实体映射设置

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

排除未列出的类

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

<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>
班级

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

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

绝大多数 JPA 和 Hibernate 应用程序使用注释来构建对象关系映射元数据。 但是,即使您正在使用注解,您仍然可以使用 XML 映射来覆盖静态注解元数据,并使用通过orm.xml配置文件提供的元数据。

例如,您可以默认使用SEQUENCE标识符生成器,​​使用@SequenceGenerator注释并将其替换为IDENTITY for 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。

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 ) );

在 intellij 中,一种好的方法是转到“文件 > 项目结构 > 构面”。 然后在 src/main/resources/META-INF/persistence.xml 中添加新的 persistence.xml。 单击应用,它将为您创建。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM