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

Val*_*lva 7 java hibernate java-ee

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

这是我在'Core'模式下配置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>
Run Code Online (Sandbox Code Playgroud)

nir*_*nir 8

创建驻留在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>
Run Code Online (Sandbox Code Playgroud)


Vla*_*cea 7

JPA 持久性 XML 文件位置

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

src/main/resources/META-INF/persistence.xml
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

persistence标记是根 XML 元素,它定义了 JPA 版本和用于验证persistence.xml配置文件的 XML 模式。

持久化单元

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

@PersistenceUnit(name = "HypersistenceOptimizer")
private EntityManagerFactory entityManagerFactory;
Run Code Online (Sandbox Code Playgroud)

transaction-type属性定义了 JPA 事务策略,它可以采用以下两个值之一:

  • JTA
  • RESOURCE_LOCAL

传统上,Java EE 应用程序默认使用 JTA,这需要 JTA 事务管理器使用 2PC(两阶段提交)协议以原子方式将更改应用于多个数据源(例如,数据库系统、JMS 队列、缓存)。

如果要将更改传播到单个数据源,则不需要 JTA,因此RESOURCE_LOCAL事务类型是一种更有效的替代方法。例如,默认情况下,Spring 应用程序使用RESOURCE_LOCAL事务,而要使用JTA,您需要明确选择JtaTranscationManagerSpring bean。

描述

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

提供者

providerXML元素定义的完全合格的类名实现JPAPersistenceProvider接口。

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

如果您使用的是 Hibernate 4.2 或更旧的版本,那么您需要使用org.hibernate.ejb.HibernatePersistence类名来代替。

jta-data-source 和非 jta-data-source

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 提供程序特定的属性来配置:

实体映射设置

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

排除未列出的类

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

<exclude-unlisted-classes>true</exclude-unlisted-classes>
Run Code Online (Sandbox Code Playgroud) 班级

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

<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>
Run Code Online (Sandbox Code Playgroud)

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

例如,您可以使用注解SEQUENCE默认使用标识符生成器@SequenceGenerator并将其替换IDENTITY为不支持数据库序列的 MySQL。

映射文件

默认情况下,orm.xml配置文件位于META-INF文件夹中。如果要使用不同的文件位置,可以使用文件中的mapping-fileXML 元素persistence.xml,如下所示:

<mapping-file>file:///D:/Vlad/Work/Examples/mappings/orm.xml</mapping-file>
Run Code Online (Sandbox Code Playgroud) jar 文件

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

<jar-file>lib/hypersistence-optimizer-glassfish-hibernate-example.jar</jar-file>
Run Code Online (Sandbox Code Playgroud)

共享缓存模式

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属性以编程方式覆盖策略,如下所示:

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

验证模式

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

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

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

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

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