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文件中配置,如下所示。



org.hibernate.ejb.HibernatePersistence





 

 

其中,“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”指定配置文件的位置,如下所示。



org.hibernate.ejb.HibernatePersistence




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

 

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

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

·属性名:hibernate.ejb.classcache.

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

示例如下:

·属性名:hibernate.ejb.collectioncache.

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

示例如下:

value="read-write , RegionName "/>

★ 提示 ★

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

·属性名:hibernate.ejb.cfgfile

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

示例如下:

 

·属性名:hibernate.archieve.autodetection

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

可选值:

·class:.class类文件。

·hbm:Hibernate 配置文件。

默认两个都搜索。

示例如下:

·属性名:hibernate.ejb.interceptor

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

示例如下:

 


·属性名:hibernate.ejb.naming_strategy

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

可选值:

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

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

示例如下:

 


·属性名:hibernate.ejb.event.

描述:配置事件监听器,其中为监听的事件类型,事件类型如表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

示例如下:

其中,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 {
 // 覆盖父类中的方法
@Override
public void onPersist(PersistEvent event) throws HibernateException {
super.onPersist(event);
//代码处理
}
}

·属性名:hibernate.ejb.use_class_enhancer

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

可选值:

·true:启用扩展类。

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

示例如下:

 
   
 
    

属性名

   

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.FileAppender
log4j.appender.file.File=hibernate.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.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等。

示例如下:


★ 提示 ★

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

·属性名:hibernate.cache.use_minimal_puts

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

可选值:

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

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

示例如下:

 
   
 
   
 
   
 
   
 
   
 
   
 
   

 value=" 25”/>

·属性名:hibernate.jdbc.batch_versioned_data

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

可选值:

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

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

示例如下:

 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
    

属性名

   

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

示例如下:

 
   
 
   
 
   
 
   

·属性名:hibernate.hbm2ddl.auto

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

可选值:

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

·create:只创建新的。

·update:更新。

·validate:只进行验证。

示例如下:

·属性名:hibernate.default_schema

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

示例如下:

·属性名:hibernate.default_catalog

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

示例如下:

·属性名:hibernate.max_fetch_depth

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

示例如下:

·属性名:hibernate.default_batch_fetch_size

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

示例如下:

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

 

来自:http://book.51cto.com/art/200806/76698.htm

你可能感兴趣的:(SSH)