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

新手上路,请多包涵

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

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

 <?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>

原文由 Valter Silva 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 816
1 个回答

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 持久性单元的名称,您可以稍后在使用 @PersistenceUnit JPA 注释注入关联的 EntityManagerFactory 413 时引用它实例:

 @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

描述

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 指定 JNDI 名称 DataSource ,而对于 RESOURCE_LOCAL 你需要使用 non-jta-data-source

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

特性

properties 元素允许您定义 JPA 或 JPA 提供程序特定的属性以配置:

实体映射设置

默认情况下,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 文件夹中。如果要使用不同的文件位置,可以使用 mapping-file persistence.xml 文件中的 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 验证提供程序,它将自动注册,并且将验证所有实体。如果未找到 Bean 验证提供程序,则不会验证实体。这是默认值。
  • CALLBACK - 实体必须始终由 Bean 验证提供程序进行验证。如果 JPA 提供者在类路径上没有找到 Bean Validation 实现,则引导过程将失败。
  • NONE - 即使在类路径上找到 Bean 验证提供程序,实体也不会被验证。

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

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

原文由 Vlad Mihalcea 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题