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.
描述:指定集合实体类缓存,设置同上。
示例如下:
★ 提示 ★
读者若想了解更多的缓存设置,请参阅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 可选的监听事件类型
事件类型 |
监听器类 |
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(默认):禁用扩展类。
示例如下:
|
例如,下面为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:禁用最小化读写操作。
示例如下:
|
·属性名:hibernate.jdbc.batch_versioned_data
描述:JDBC执行批量操作时,是否同时更新版本数据。
可选值:
·true(默认):执行批量操作executeBatch()返回成功的记录数,并且更新版本数据。
·false:批量操作后不更新版本数据。
示例如下:
|
属性名 |
描 述 |
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