[英]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>
传统上,persistence.xml 位于一个META-INF
文件夹中,该文件夹需要驻留在 Java 类路径的根目录中。 如果您使用的是 Maven,则可以将其存储在resources
文件夹中,如下所示:
src/main/resources/META-INF/persistence.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
类名。
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
配置属性来指定要使用的 JDBCDataSource
。
properties
元素允许您定义要配置的 JPA 或 JPA 提供程序特定的属性:
Dialect
org.hibernate.cfg.AvailableSettings
界面中找到更多属性。默认情况下,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.