尽管Hibernate 3.0 与Hibernate2.1的源代码是不兼容的,但是当Hibernate开发小组在设计Hibernate3.0时,为简化升级Hibernate版本作了周到的考虑。对于现有的基于 Hibernate2.1的Java项目,可以很方便的把它升级到Hibernate3.0。

 

 

本文描述了Hibernate3.0版本的新变化,Hibernate3.0版本的变化包括三个方面:
(1)API的变化,它将影响到Java程序代码。

1.1 包名
Hibernate3.0的包的根路径为: “org.hibernate” ,而在Hibernate2.1中为“net.sf.hibernate”。这一命名变化使得Hibernate2.1和Hibernate3.0能够同时在同一个应用程序中运行。

把Java源程序中的所有“net.sf.hibernate”替换为“org.hibernate”。

Hibernate2.1中的“net.sf.hibernate.expression”包被改名为 “org.hibernate.criterion”。假如应用程序使用了Criteria API,那么在升级的过程中,必须把Java源程序中的所有“net.sf.hibernate.expression”替换为 “org.hibernate.criterion”。

1.2

升级EHCache:
(1)手工修改net.sf.ehcache.hibernate.Provider类,使它引用Hibernate3.0 中的接口。
(2)等到EHCache软件本身升级为使用Hibernate3.0后,使用新的 EHCache软件。
(3)使用Hibernate3.0中内置的 CacheProvider:org.hibernate.cache.EhCacheProvider。

 

1.3 Hibernate3.0把一些被废弃的接口都转移到 org.hibernate.classic中。

在Hibernate3.0中,Session接口中被废弃的方法包括:
* 执行查询的方法:find()、iterate()、filter()和delete(String hqlSelectQuery)
* saveOrUpdateCopy()

 

1.4

对Blob 和Clob的支持
Hibernate对Blob和Clob实例进行了包装,使得那些拥有Blob或Clob类型的属性的类的实例可以被游离、序列化或反序列化,以及传递到merge()方法中。

1.5

createSQLQuery()
在Hibernate3.0中,Session接口的 createSQLQuery()方法被废弃,被移到org.hibernate.classic.Session接口中。Hibernate3.0采用新的SQLQuery接口来完成相同的功能。

 

Hibernate3.0一律采用createQuery()方法来执行所有的查询语句,采用DELETE 查询语句来执行批量删除,采用merge()方法来替代 saveOrUpdateCopy()方法。


(2)元数据,它将影响到对象-关系映射文件。

2.1

检索策略
在Hibernate2.1中,lazy属性的默认值为“false”,而在Hibernate3.0 中,lazy属性的默认值为“true”。在升级映射文件时,如果原来的映射文件中的有关元素,如等没有显式设置lazy属性,那么必须把它们都显式的设置为 lazy=“true”。如果觉得这种升级方式很麻烦,可以采取另一简单的升级方式:在<hibernate-mapping& gt;元素中设置: default-lazy=“false”。

2.2

DTD
对象-关系映射文件中的DTD文档,由原来的:
http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd
改为:
http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd


(3)HQL查询语句。

Hibernate3.0 采用新的基于ANTLR的HQL/SQL查询翻译器,不过,Hibernate2.1的查询翻译器也依然存在。在Hibernate的配置文件中,hibernate.query.factory_class属性用来选择查询翻译器。例如:
(1)选择Hibernate3.0的查询翻译器:
hibernate.query.factory_class= org.hibernate.hql.ast.ASTQueryTranslatorFactory
(2)选择Hibernate2.1的查询翻译器
hibernate.query.factory_class= org.hibernate.hql.classic.ClassicQueryTranslatorFactory

HQL的select子句中废弃了indices()和elements()函数,因为这两个函数的语法很让用户费解,可以用显式的连接查询语句来替代 select elements(...) 。而在HQL的where子句中,仍然可以使用elements()函数。