Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1970741
  • 博文数量: 606
  • 博客积分: 9991
  • 博客等级: 中将
  • 技术积分: 5725
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-17 19:07
文章分类

全部博文(606)

文章存档

2011年(10)

2010年(67)

2009年(155)

2008年(386)

分类:

2008-08-02 18:49:11

文章搜索:   

本文描述了Hibernate3.0版本的新变化,Hibernate3.0版本的变化包括三个方面:

(2)元数据,它将影响到对象-关系映射文件.
(3)HQL查询语句.

值得注意的是, Hibernate3.0并不会完全取代Hibernate2.1.在同一个应用程序中,允许Hibernate3.0和Hibernate2.1并存.

1.1 Hibernate API 变化

1.1.1 包名

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

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

如果应用使用了除Hibernate以外的其他外部软件,而这个外部软件又引用了Hibernate的接口,那么在升级时必须十分小心.例如EHCache拥有自己的CacheProvider: net.sf.ehcache.hibernate.Provider,在这个类中引用了Hibernate2.1中的接口,在升级应用时,可以采用以下办法之一来升级EHCache:

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

1.1.2 org.hibernate.classic包

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

1.1.3 Hibernate所依赖的第三方软件包

在Hibernate3.0的软件包的lib目录下的README.txt文件中,描述了Hibernate3.0所依赖的第三方软件包的变化.

在Hibernate3.0中,HibernateException异常以及它的所有子类都继承了java.lang.RuntimeException.因此在编译时,编译器不会再检查HibernateException.

1.1.5 Session接口



org.hibernate.classic.Session session=sessionFactory.openSession();
session.delete("delete from Customer ");

在Hibernate3.0中,org.hibernate.classic.Session接口继承了org.hibernate.Session接口,在org.hibernate.classic.Session接口中包含了一系列被废弃的方法,如find()、interate()等.SessionFactory接口的openSession()方法返回org.hibernate.classic.Session类型的实例.如果希望在程序中完全使用Hibernate3.0,可以采用以下方式创建Session实例:



org.hibernate.Session session=sessionFactory.openSession();

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

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


提示:在Hibernate2.1中,Session的delete()方法有几种重载形式,其中参数为HQL查询语句的delete()方法在Hibernate3.0中被废弃,而参数为Ojbect类型的的delete()方法依然被支持.delete(Object o)方法用于删除参数指定的对象,该方法支持级联删除.

Hibernate2.1没有对批量更新和批量删除提供很好的支持,参见<<精通Hibernate>>一书的第13章的13.1.1节(批量更新和批量删除),而Hibernate3.0对批量更新和批量删除提供了支持,能够直接执行批量更新或批量删除语句,无需把被更新或删除的对象先加载到内存中.以下是通过Hibernate3.0执行批量更新的程序代码:



 sessionFactory.openSession();
Transaction tx = session***="update Customer set name = :newName where name = :oldName" s.createQuery( hqlUpdate )
.setString( "newName"

 sessionFactory.openSession();
Transaction tx = session***="delete Customer where name = :oldName" s.createQuery( hqlDelete )
.setString( "oldName"

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

1.1.7 Lifecycle 和 Validatable 接口

Lifecycle和Validatable 接口被废弃,并且被移到org.hibernate.classic包中.

1.1.8 Interceptor接口

在Interceptor 接口中加入了两个新的方法. 用户创建的Interceptor实现类在升级的过程中,需要为这两个新方法提供方法体为空的实现.此外,instantiate()方法的参数作了修改,isUnsaved()方法被改名为isTransient().

1.1.9 UserType和CompositeUserType接口

在UserType和CompositeUserType接口中都加入了一些新的方法,这两个接口被移到org.hibernate.usertype包中,用户定义的UserType和CompositeUserType实现类必须实现这些新方法.

Hibernate3.0提供了ParameterizedType接口,用于更好的重用用户自定义的类型.

1.1.10 FetchMode类

FetchMode.LAZY 和 FetchMode.EAGER被废弃.取而代之的分别为FetchMode.SELECT 和FetchMode.JOIN.

1.1.11 PersistentEnum类

PersistentEnum被废弃并删除.已经存在的应用应该采用UserType来处理枚举类型.

1.1.12 对Blob 和Clob的支持

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

org.hibernate.criterion、 org.hibernate.mapping、 org.hibernate.persister和org.hibernate.collection 包的结构和实现发生了重大的变化.多数基于Hibernate
2.1 的应用不依赖于这些包,因此不会被影响.如果你的应用扩展了这些包中的类,那么必须非常小心的对受影响的程序代码进行升级.

1.2 元数据的变化

1.2.1 检索策略

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

1.2.2 对象标识符的映射

unsaved-value属性是可选的,在多数情况下,Hibernate3.0将把unsaved-value="0" 作为默认值.

在Hibernate3.0中,当使用自然主键和游离对象时,不再强迫实现Interceptor.isUnsaved()方法. 如果没有设置这个方法,当Hibernate3.0无法区分对象的状态时,会查询数据库,来判断这个对象到底是临时对象,还是游离对象.不过,显式的使用Interceptor.isUnsaved()方法会获得更好的性能,因为这可以减少Hibernate直接访问数据库的次数.

1.2.3 集合映射

元素在某些情况下被元素替代.此外,Hibernate3.0用 元素来替代原来的.元素,用元素来替代原来的元素.

1.2.4 DTD

1.3 查询语句的变化

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

提示:ANTLR是用纯Java语言编写出来的一个编译工具,它可生成Java语言或者是C++的词法和语法分析器,并可产生语法分析树并对该树进行遍历.ANTLR由于是纯Java的,因此可以安装在任意平台上,但是需要JDK的支持.


值得注意的是, Hibernate3.0的查询翻译器存在一个Bug:不支持某些theta-style连结查询方言:如Oracle8i的OracleDialect方言、Sybase11Dialect.解决这一问题的办法有两种:(1)改为使用支持ANSI-style连结查询的方言,如 Oracle9Dialect,(2)如果升级的时候遇到这一问题,那么还是改为使用Hibernate2.1的查询翻译器.

1.3.1 indices()和elements()函数

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

 

 

http://blog.163.com/shn_000/blog/static/1713139120084454058684/

阅读(815) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~