Hibernate框架使用技术简述
(1)持久化对象的操作。
Hibernate的主旨是实现持久化对象与数据库表的映射。
如何操作持久化对象就成了主要的技术问题。Hibernate 在处理持久化对象时,没有直接创建和调用持久化对象和它的方法,而是利用 CGLIB 和 Java 反射技术来操纵持久化对象,通过代理的模式,在持久化对象的属性方法被调用的同时穿插外部的代码,甚至利用CGLIB的编程接口来替换持久化类的对象和方法。这种方式使Hibernate 可以较为容易地处理大量不同类别的持久化对象。
(2)HQL 语言的转换。
Hibernate3.0 基于 antlr 工具设计了 HQL 语言。Hibernate通过解析器解析 HQL 语句,然后分析出其内容并转化为 SQL 语句。借助 antlr 工具,这种转换变得可靠并易于实现。可以在hibernate.cfg.xml中,设置查询语言的转换器工厂,例如下面的属性设置。
<property name="hibernate.query.factory_class"> org.hibernate.hql.ast.ASTQueryTranslatorFactory property>
(3)事务服务。
Hibernate没有特别设计自己的事务服务部分,而是借助于JDBC的事务服务,或者通过配置来借用J2EE 服务器内的 JTA 标准事务服务。
(4)XML映射文件。
Hibernate的配置和映射文件的定制主要以XML来实现。DOM4J 工具为Hibernate 提供了处理 XML 文件的解析器,XML 文件在被导入Hibernate后,被配置到Hibernate 的各个属性或者与持久化类对应。通过配置工具,很多属性也可
以在运行状态下进行修改和加载。
(5)执行查询语句。
Hibernate 的Session 仍然依赖于JDBC 的查询接口,封装 JDBC的查询方法,在抽象的层次上同时支持SQL 和 HQL 两种查询语言。
(6)数据库方言。
不同数据库产品的数据类型和查询语句有一定的区别,所以创建和管理数据库资源的语句也往往不尽相同。Hibernate 设计了方言(Dialect)接口来处理这些差异,使针对各种数据库产品的操作得以统一,这也是Hibernate 十分流行的原因之一。
(7)JNDI 服务。
Hibernate自身没有实现JNDI服务,依靠外界提供JNDI服务,通常可以将Hibernate的SessionFactory 对象绑定到 JNDI,或者通过JNDI 获取数据源和其他对象。
(8)缓冲技术。
在 Hibernate中可以使用多种缓冲工具,只要它们实现了CacheProvider 接 口 , 就 可 以 用 于 Hibernate 中 , 其 中 包 括 实 现 OSCache的OSCacheProvider 、 实 现 EHCache 的 EhCacheProvider 、 实 现 SwarmCache 的SwarmCacheProvider 、实现 JBossCache 的 TreeCacheProvider ,以及简单地利用一个Hashtable 来实现的HashtableCacheProvider 。下面的属性设置对应于OSCache。
<property name="hibernate.cache.provider_class"> org.hibernate.cache.OSCacheProvider property>
Hibernate的缓冲机制分为两层。第一层缓冲在 Session中实现,属于事务级别的缓冲,随事务结束而消失。第二层缓冲是在持久化实例的范围内进行缓冲,默认情况Hibernate 使用 EHCache来实现。EHCache不支持集群应用,所以在集群环境下需要将缓冲设置改变为 SwarmCache 或JBossCache 。
(9)连接池。
Hibernate被设计为可以使用多种连接池的系统,只要ConnectionProvider 接口,不同类型的连接池或其他能够提供连接的组件就可以被嵌入到 Hibernate来提供数据库连接。Hibernate中主要包括基于C3P0连接池的C3P0ConnectionProvider和基于Proxool连接池的ProxoolConnectionProvider。与C3P0连接池相关的部分配置属性如下:
(10)事件模型。<property name="hibernate.connection.provider_class"> org.hibernate.connection.C3P0ConnectionProvider property> <property name="hibernate.c3p0.min_size">8property> <property name="hibernate.c3p0.max_size">20property> <property name="hibernate.c3p0.timeout">2500property> <property name="hibernate.c3p0.max_statements">50property>
Hibernate 设计了一个事件模型,利用这个模型将持久化实体的操
作事件和处理事件的监听器联系起来,为实现 Hibernate的功能提供了一个可扩展的模型。目前Hibernate内的事件包括auto-flush,merge,create,delete,dirty-check,evicflush,flush-entity,load,load-collection,lock,refresh,replicate 和 save-update 等。事件的监听器可以由用户自定义实现,并通过 listener元素声明,例如,下面的这个关于
POLoadListener 的声明。