hibernate 和jpa

JPA作为Java EE的规范,它只是提供了一种标准的API。程序员若要使用JPA,仍需要选择JPA的实现框架。通过本章的学习,读者将能够了解与不同的JPA实现框架相关的知识,以便在实际的项目中做出合适的选择。

Hibernate是最流行的ORM框架之一,也是最早实现JPA的规范框架之一。它被JBoss收购后,目前作为JBoss的一个开源框架,它遵循LGPL v2.1开源许可协议,官方主页是http://www.hibernate.org/

Hibernate 3.2以及以后的版本开始支持JPA,如图14-1所示为Hibernate框架包含的所有子项目。其中,涉及JPA的子项目有三个,它们分别是:

·Hibernate Core:Hibernate框架的核心实现。

·Hibernate Annotations:支持JDK 5.0的注释。

·Hibernate EntityManager:支持JPA的实现。

Hibernate JPA自定义配置可以通过多种方式进行配置,如下面列举的几种方法。

·方法一:在persistence.xml文件中配置,如下所示。

Java代码   收藏代码
  1. <persistence>  
  2. <persistence-unit name="jpaUnit"  transaction-type="RESOURCE_LOCAL">  
  3. <provider>org.hibernate.ejb.HibernatePersistence</provider>  
  4. <properties>  
  5. <property name="hibernate.connection.driver_class"value="com.mysql.jdbc.Driver" />  
  6. <property name="hibernate.connection.url"value="jdbc:mysql://localhost:3306/jpademo" />  
  7. <property name="hibernate.connection.username" value="root" />  
  8. <property name=" hibernate.show_sql " value="true"/>  
  9. </properties>   
  10. </persistence-unit>  
  11. </persistence>  

 

其中,“hibernate.show_sql ”为可配置的属性,Hibernate JPA还提供很多不同属性的配置。

·方法二:通过代码,在创建EntityManagerFactory时指定,如下所示。

Map configOverrides = new HashMap();
configOverrides.put("hibernate.format_sql ", true);
EntityManagerFactory programmaticEmf =
Persistence.createEntityManagerFactory("jpaUnit", configOverrides

当同时使用方法一和方法二设置时,方法二的方式为有效的配置。

·方法三:使用Hibernate 专有的配置文件来配置,但首先要在persistence.xml文件中配置“hibernate.ejb.cfgfile”指定配置文件的位置,如下所示。

Xml代码   收藏代码
  1. <persistence>  
  2. <persistence-unit name="jpaUnit"  transaction-type="RESOURCE_LOCAL">  
  3. <provider>org.hibernate.ejb.HibernatePersistence</provider>  
  4. <properties>  
  5. <property name="hibernate.connection.driver_class"value="com.mysql.jdbc.Driver" />  
  6. <property name="hibernate.connection.url"value="jdbc:mysql://localhost:3306/jpademo" />  
  7. <property name="hibernate.connection.username" value="root" />  
  8. <!—可选,配置Hibernate配置文件-->    
  9. < property name="hibernate.ejb.cfgfile" value="/com/fengmanfei/jpa/hibernate.cfg.xml">  
  10. </properties>   
  11. </persistence-unit>  
  12. </persistence>  

 

其中,“/com/fengmanfei/jpa/hibernate.cfg.xml”为Hibernate配置文件的保存位置。使用这种方式,适用于将现有Hibernate应用移植到JPA应用中来。但要注意,方法三的优先级最低,如果与方法一和方法二冲突,则方法一或方法二中的配置有效。

方法一和方法二是JPA的标准配置,方法三是Hibernate特有的配置。并不是所有的属性都可以通过这三种方式配置,其中一些属性必须通过方法一和方法二来配置,这些属性的详细说明如下所示。

·属性名:hibernate.ejb.classcache.<classname>

描述:指定缓存实体对象,<classname>为缓存类的全名,值为缓存类型,以逗号分隔。

示例如下:

<property name="hibernate.ejb.classcache. com.fengmanfei.jpa.entity.Customer" value="read-write"/>

·属性名:hibernate.ejb.collectioncache.<collectionrole>

描述:指定集合实体类缓存,设置同上。<collectionrole>为集合类的全名,值为缓存类型,以逗号分隔。

示例如下:

<property name="hibernate.ejb.collectioncache.com.fengmanfei.jpa.entity.Customer. orders" 
value="read-write , RegionName "/>

★ 提示 ★

读者若想了解更多的缓存设置,请参阅JBoss Cache的相关文档。

·属性名:hibernate.ejb.cfgfile

描述:指定使用Hibernate配置文件中的配置。

示例如下:

 <property name="hibernate.ejb.cfgfile"  value="/com/fengmanfei/jpa/hibernate.cfg.xml"/ >

·属性名:hibernate.archieve.autodetection

描述:创建Entity Manager时搜索文件的类型,多个值之间用逗号分隔。

可选值:

·class:.class类文件。

·hbm:Hibernate 配置文件。

默认两个都搜索。

示例如下:

<property name="hibernate.archive.autodetection" value="class,hbm"/>

·属性名:hibernate.ejb.interceptor

描述:自定义拦截器类名,拦截器必须实现了org.hibernate.Interceptor接口,并且有无参的构造方法。

示例如下:

 

<property name=" hibernate.ejb.interceptor "  value="com.fengmanfei.jpa.interceptor.MyInterceptor"/>

·属性名:hibernate.ejb.naming_strategy

描述:设置注释命名策略。

可选值:

·EJB3NamingStrategy(默认):EJB3规范的命名实现。

·DefaultComponentSafeNamingStrategy:在默认的EJB3NamingStrategy上进行了扩展,允许在同一实体中使用两个同类型的嵌入对象而无须额外的声明。

示例如下:

 

<property name=" hibernate.ejb.naming_strategy " value=" DefaultComponentSafeNamingStrategy "/>

·属性名:hibernate.ejb.event.<eventtype>

描述:配置事件监听器,其中<eventtype>为监听的事件类型,事件类型如表14-1中列举所示。而值则为具体监听器类的全名,如果有多个则使用逗号分隔。自定义拦截器类,拦截器必须实现了org.hibernate.Interceptor接口,并且有无参的构造方法,在JPA的环境中,尽量继承表14-1中的时间监听器类。

表14-1  可选的监听事件类型

事件类型

监听器类

flush

org.hibernate.ejb.event.EJB3FlushEventListener

auto-flush

org.hibernate.ejb.event.EJB3AutoFlushEventListener

delete

org.hibernate.ejb.event.EJB3DeleteEventListener

flush-entity

org.hibernate.ejb.event.EJB3FlushEntityEventListener

merge

org.hibernate.ejb.event.EJB3MergeEventListener

create

org.hibernate.ejb.event.EJB3PersistEventListener

create-onflush

org.hibernate.ejb.event.EJB3PersistOnFlushEventListener

save

org.hibernate.ejb.event.EJB3SaveEventListener

save-update

org.hibernate.ejb.event.EJB3SaveOrUpdateEventListener

 

事件类型

监听器类

pre-insert

org.hibernate.secure.JACCPreInsertEventListener,org.hibernate.valitator.event.ValidateEventListener

pre-update

org.hibernate.secure.JACCPreUpdateEventListener,org.hibernate.valitator.event.ValidateEventListener

pre-delete

org.hibernate.secure.JACCPreDeleteEventListener

pre-load

org.hibernate.secure.JACCPreLoadEventListener

post-delete

org.hibernate.ejb.event.EJB3PostDeleteEventListener

post-insert

org.hibernate.ejb.event.EJB3PostInsertEventListener

post-load

org.hibernate.ejb.event.EJB3PostLoadEventListener

post-update

org.hibernate.ejb.event.EJB3PostUpdateEventListener

示例如下:

<property name="hibernate.ejb.event.create" value="com.fengmanfei.listener.CreateListener" />

其中,CreateListener继承org.hibernate.ejb.event.EJB3PersistEventListener类,代码如下所示。

package com.fengmanfei.listener;
import org.hibernate.HibernateException;import org.hibernate.ejb.event.EJB3PersistEventListener;import org.hibernate.event.PersistEvent;
public class CreateListener extends EJB3PersistEventListener {
 // 覆盖父类中的方法@Overridepublic void onPersist(PersistEvent event) throws HibernateException {super.onPersist(event);//代码处理}}

·属性名:hibernate.ejb.use_class_enhancer

描述:是否启用应用服务器扩展类。

可选值:

·true:启用扩展类。

·false(默认):禁用扩展类。

示例如下:

<property name=" hibernate.ejb.use_class_enhancer "  value=" true”/>

·属性名:hibernate.ejb.discard_pc_on_close

描述:是否在执行clear()时脱离持久化上下文。

可选值:

·true:执行clear()时脱离持久化上下文。

·false(默认):执行clear()时不脱离持久化上下文。

示例如下:

<property name=" hibernate.ejb.discard_pc_on_close "  value=" true”/>

Hibernate使用Apache commons-logging来为各种事件记录日志。commons-logging将直接将日志输出到Apache Log4j(如果在类路径中包括log4j.jar)或 JDK1.4 logging (如果运行在JDK1.4或以上的环境下)。

如果使用Log4j,需要将log4j.properties文件保存在类路径中。Hibernate根据对日志进行了详细的分类,以便能够控制日志的的输出信息,这些日志类别如表14-2所示。

表14-2  Hibernate JPA实现日志类别

属性名

描    述

org.hibernate.SQL

记录SQL DML语句

org.hibernate.type

记录JDBC参数

org.hibernate.tool.hbm2ddl

记录SQL DDL语句

org.hibernate.pretty

记录提交实体时,相关联的20个实体的状态

org.hibernate.cache

记录所有二级缓存

org.hibernate.transaction

记录事务相关的操作

org.hibernate.jdbc

记录获取JDBC资源的操作

org.hibernate.hql.ast.AST

记录HQL 和SQL AST的查询语句

org.hibernate.secure

记录JAAS认证请求

org.hibernate

记录所有信息,建议在调试开发阶段设置

例如,下面为log4j.properties配置日志的示例代码。

### log4j基本配置 ###log4j.appender.file=org.apache.log4j.FileAppenderlog4j.appender.file.File=hibernate.loglog4j.appender.file.layout=org.apache.log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### 设置日志级别###log4j.rootLogger=info, stdout###输出hibernate调试过程中的错误日志log4j.logger.org.hibernate=debug
###输出HQL查询调试日志log4j.logger.org.hibernate.hql.ast.AST=debug
### 输出SQL语句调试日志log4j.logger.org.hibernate.SQL=debug### 输出 JDBC参数查询的日志 ###log4j.logger.org.hibernate.type=info
### 输出缓存日志 ###log4j.logger.org.hibernate.cache=debug
### 输出事务日志###log4j.logger.org.hibernate.transaction=debug
###输出获取JDBC资源日志###log4j.logger.org.hibernate.jdbc=debug

Hibernate除了自动对Session级别的事务进行一级缓存外,二级缓存的优化是Hibernate实现的一个亮点之一,有关二级缓存的属性如下所示。

 属性名:hibernate.cache.provider_class

描述:二级缓存实现的类全名,所使用的缓存都需要实现org.hibernate.cache. CacheProvider接口,Hibernate已经实现了一些缓存,开发人员可以直接配置使用,同时要启用二级缓存,配置hibernate.cache.use_second_level_cache为true。

可选值:

org.hibernate.cache.HashtableCacheProvide、org.hibernate.cache.EhCacheProvider、org.hibernate.

cache.OSCacheProvider、org.hibernate.cache.SwarmCacheProvider和org.hibernate. cache.Tree CacheProvider等。

示例如下:

<property name=" hibernate.cache.provider_class " value=" org.hibernate.cache.HashtableCacheProvide "/>

★ 提示 ★

有关各种缓存实现的详细区别,读者可以参阅Hiberante Core的相关文档。

·属性名:hibernate.cache.use_minimal_puts

描述:是否优化二级缓存来最小化读写操作,集群时的缓存优化。

可选值:

·true(默认):启用最小化读写操作。

·false:禁用最小化读写操作。

示例如下:

<property name=" hibernate.cache.use_minimal_puts "  value=" false”/>

·属性名:hibernate.cache.use_query_cache

描述:是否缓存查询结果。

可选值:

·true:缓存查询结果。

·false:不缓存查询结果。

示例如下:

<property name=" hibernate.cache.use_query_cache "  value=" true”/>

·属性名:hibernate.cache.use_second_level_cache

描述:是否启用二级缓存。

可选值:

·true:启用二级缓存。

·false:不使用二级缓存。

示例如下:

<property name=" hibernate.cache.use_second_level_cache "  value=" true”/>

·属性名:hibernate.cache.query_cache_factory

描述:设置自定义的查询缓存类全名,缓存类必须实现org.hibernate.cache.QueryCache接口。

可选值:

·org.hibernate.cache.StandardQueryCache(默认)。

·自定义缓存实现类。

示例如下:

<property name=" hibernate.cache.query_cache_factory "  value=" com.fengmanfei.cache.MyCache”/>

·属性名:hibernate.cache.region_prefix

描述:二级缓存的前缀名称。

示例如下:

<property name=" hibernate.cache.region_prefix "  value=" jpa”/>

·属性名:hibernate.cache.use_structured_entries

描述:是否使用结构化的方式缓存对象。

可选值:

·true:结构化方式缓存对象。

·false:不使用结构化的方式缓存对象。

示例如下:

<property name=" hibernate.cache.use_structured_entries "  value=" true”/>

Hibernate自定义JDBC和数据库配置属性如下所示。

·属性名:hibernate.jdbc.fetch_size

描述:JDBC抓取记录的大小,相当于设置Statement.setFetchSize(),默认值为25。

示例如下:

<property name="hibernate.jdbc.fetch_size"  value="50”/>

·属性名:hibernate.jdbc.batch_size

描述:JDBC2批量更新的大小,建议设置为5~30之间的值,默认为5。

示例如下:

<property name="hibernate.jdbc.batch_size"  value=" 25”/>

·属性名:hibernate.jdbc.batch_versioned_data

描述:JDBC执行批量操作时,是否同时更新版本数据。

可选值:

·true(默认):执行批量操作executeBatch()返回成功的记录数,并且更新版本数据。

·false:批量操作后不更新版本数据。

示例如下:

<property name="hibernate.jdbc.batch_versioned_data"  value="false”/>

·属性名:hibernate.jdbc.batch_versioned_data

描述:JDBC执行批量操作时,是否同时更新版本数据。

可选值:

·true(默认):执行批量操作executeBatch()返回成功的记录数,并且更新版本数据。

·false:批量操作后不更新版本数据。

示例如下:

<property name="hibernate.jdbc.batch_versioned_data"  value="false”/>

·属性名:hibernate.jdbc.use_scrollable_resultset

描述:是否允许Hibernate使用JDBC2的可滚动结果集。

可选值:

·true(默认):可使用可滚动结果集,只有在使用用户提供的JDBC连接时,才需要设置为启用。

·false:不可使用滚动结果集。

示例如下:

<property name="hibernate.jdbc.use_scrollable_resultset"  value="false”/>

·属性名:hibernate.jdbc.use_streams_for_binary

描述:是否JDBC以二进制方式读取。

可选值:

·true(默认):以二进制方式读取。

·false:以二进制方式读取,而以序列化方式读取。

示例如下:

<property name="hibernate.jdbc.use_streams_for_binary"  value="false”/>

·属性名:hibernate.jdbc.use_get_generated_keys

描述:是否使用JDBC3插入记录时使用PreparedStatement.getGeneratedKeys()生成主键。

可选值:

·true:使用PreparedStatement.getGeneratedKeys()生成主键。

·false(默认):使用Hibernate自定义的生成策略。

示例如下:

<property name="hibernate.jdbc.use_get_generated_keys"  value="true”/>

·属性名:hibernate.connection.isolation

描述:JDBC事务隔离级别,请读者查阅java.sql.Connection文档了解各个级别的类型,例如1、2、4(默认)、8。

示例如下:

<property name="hibernate.connection.isolation"  value="8”/>

·属性名:hibernate.connection.autocommit

描述:是否使用JDBC自动提交。

可选值:

·true(默认):自动提交。

·false:不自动提交。

示例如下:

<property name="hibernate.connection.autocommit"  value="false”/>

·属性名:hibernate.connection.driver_class

描述:数据连接的驱动类的全称,不同的数据库实现类不同。

示例如下:

<property name="hibernate.connection.driver_class"  value="com.mysql.jdbc.Driver”/>

·属性名:hibernate.connection.url

描述:数据连接的URL。

示例如下:

<property name="hibernate.connection.url"  value=" jdbc:mysql://localhost:3306/ jpademo”/>

·属性名:hibernate.connection.username

描述:数据连接的用户名。

示例如下:

<property name="hibernate.connection.username "  value="root”/>

·属性名:hibernate.connection.password

描述:数据连接的密码。

示例如下:

<property name="hibernate.connection.password "  value="123”/>

·属性名:hibernate.dialect

描述:指定不同的数据库,Hibernate底层会根据不同的数据库生成的SQL进行优化,取值如表14-3所示。

表14-3  Hibernate JPA实现不同数据库相关配置的属性

属性名

描    述

DB2

org.hibernate.dialect.DB2Dialect

DB2 AS/400

org.hibernate.dialect.DB2400Dialect

DB2 OS390

org.hibernate.dialect.DB2390Dialect

PostgreSQL

org.hibernate.dialect.PostgreSQLDialect

MySQL

org.hibernate.dialect.MySQLDialect

MySQL InnoDB

org.hibernate.dialect.MySQLInnoDBDialect

MySQL with MyISAM

org.hibernate.dialect.MySQLMyISAMDialect

Oracle

org.hibernate.dialect.OracleDialect

Oracle 9i/10g

org.hibernate.dialect.Oracle9Dialect

Sybase

org.hibernate.dialect.SybaseDialect

Sybase Anywhere

org.hibernate.dialect.SybaseAnywhereDialect

Microsoft SQL Server

org.hibernate.dialect.SQLServerDialect

SAP DB

org.hibernate.dialect.SAPDBDialect

Informix

org.hibernate.dialect.InformixDialect

HypersonicSQL

org.hibernate.dialect.HSQLDialect

属性名

描    述

Ingres

org.hibernate.dialect.IngresDialect

Progress

org.hibernate.dialect.ProgressDialect

Mckoi SQL

org.hibernate.dialect.MckoiDialect

Interbase

org.hibernate.dialect.InterbaseDialect

Pointbase

org.hibernate.dialect.PointbaseDialect

示例如下:

<property name=" hibernate.dialect "  value="org.hibernate.dialect.MySQLDialect”/>

除了前面几节列举的配置外,Hibernate的JPA实现还有一些常用的配置,如下所示。

·属性名:hibernate.show_sql

描述:是否输出SQL语句。

可选值:

·true(默认):输出SQL,相当于日志中设置org.hibernate.SQL的类别值为debug。

·false:不输出SQL。

示例如下:

<property name="hibernate.show_sql"  value="false”/>

·属性名:hibernate.format_sql

描述:是否格式化输出SQL语句。

可选值:

·true(默认):格式化输出SQL。

·false:不格式化输出SQL。

示例如下:

<property name="hibernate.format_sql "  value="false”/>

·属性名:hibernate.use_sql_comments

描述:是否输出SQL注释。

可选值:

·true(默认):输出SQL注释,有助于调试。

·false:不输出SQL注释。

示例如下:

<property name="hibernate.use_sql_comments"  value="false”/>

·属性名:hibernate.generate_statistics

描述:是否收集与运行性能有关的参数。

可选值:

·true(默认):收集与运行性能有关的参数。

·false:不收集与运行性能有关的参数。

示例如下:

<property name="hibernate.generate_statistics"  value="false"/>

·属性名:hibernate.hbm2ddl.auto

描述:对DDL的自动生成方式。

可选值:

·create-drop:删除后重新创建。

·create:只创建新的。

·update:更新。

·validate:只进行验证。

示例如下:

<property name=" hibernate.hbm2ddl.auto "  value="create-drop"/>

·属性名:hibernate.default_schema

描述:生成的SQL默认的schema名称。

示例如下:

<property name="hibernate.default_schema"  value="test"/>

·属性名:hibernate.default_catalog

描述:生成的SQL默认的catalog名称。

示例如下:

<property name="hibernate.default_catalog"  value="test"/>

·属性名:hibernate.max_fetch_depth

描述:一对一和多对一映射时,实体加载的最大深度,0表示不抓取相关实体。建议值在0~3之间,默认为1。

示例如下:

<property name="hibernate.max_fetch_depth"  value="2"/>

·属性名:hibernate.default_batch_fetch_size

描述:加载相关联的实体集合时,所加载的相关实体个数。建议使用2的倍数值,例如4、8(默认)、16。

示例如下:

<property name="hibernate.default_batch_fetch_size"  value="16"/>

大多数情况下,Hibernate JPA中使用默认的设置就能基本满足需求,但当需求变化时,需要进行一些特殊的优化时,就可以通过自定义的一些属性来实现目标。

你可能感兴趣的:(Hibernate,jpa)