1.1 Hibernate API 变化 1.1.1 包名

1.1.2 org.hibernate.classic

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

1.1.4异常模型

1.1.5 Session接口

1.1.6 createSQLQuery()

1.1.7 Lifecycle Validatable 接口

1.1.8 Interceptor接口

1.1.9 UserTypeCompositeUserType接口

1.1.10 FetchMode 1.1.11 PersistentEnum

1.1.12Blob Clob的支持

1.1.13 Hibernate中供扩展的API的变化

1.2 元数据的变化

1.2.1检索策略

1.2.2对象标识符的映射

1.2.3集合映射

1.2.4 DTD

1.3 查询语句的变化

1.3.1 indices()elements()函数尽管Hibernate 3.0 Hibernate2.1的源代码是不兼容的,但是当Hibernate开发小组在设计Hibernate3.0时,为简化升级Hibernate版本作了周到的考虑。对于现有的基于Hibernate2.1Java项目,可以很方便的把它升级到Hibernate3.0本文描述了Hibernate3.0版本的新变化,Hibernate3.0版本的变化包括三个方面:

1API的变化,它将影响到Java程序代码。

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

3HQL查询语句。值得注意的是, Hibernate3.0并不会完全取代Hibernate2.1。在同一个应用程序中,允许Hibernate3.0Hibernate2.1并存。

 1.1 Hibernate API 变化

1.1.1包名 Hibernate3.0的包的根路径为: “org.hibernate” ,而在Hibernate2.1中为“net.sf.hibernate”。这一命名变化使得Hibernate2.1Hibernate3.0能够同时在同一个应用程序中运行。如果希望把已有的应用升级到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”如果应用使用了除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中内置的CacheProviderorg.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所依赖的第三方软件包的变化。

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

1.1.5 Session接口Hibernate3.0中,原来Hibernate2.1Session接口中的有些基本方法也被废弃,但为了简化升级,这些方法依然是可用的,可以通过org.hibernate.classic.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(); 如果是对已有的程序进行简单的升级,并且希望仍然调用Hibernate2.1Session的一些接口,可以采用以下方式创建Session实例: org.hibernate.classic.Session session=sessionFactory.openSession(); Hibernate3.0中,Session接口中被废弃的方法包括: * 执行查询的方法:find()iterate()filter()delete(String hqlSelectQuery) * saveOrUpdateCopy() Hibernate3.0一律采用createQuery()方法来执行所有的查询语句,采用DELETE 查询语句来执行批量删除,采用merge()方法来替代 saveOrUpdateCopy()方法。提示:在Hibernate2.1中,Sessiondelete()方法有几种重载形式,其中参数为HQL查询语句的delete()方法在Hibernate3.0中被废弃,而参数为Ojbect类型的的delete()方法依然被支持。delete(Object o)方法用于删除参数指定的对象,该方法支持级联删除。 Hibernate2.1没有对批量更新和批量删除提供很好的支持,参见<<精通Hibernate>>一书的第13章的13.1.1节(批量更新和批量删除),而Hibernate3.0对批量更新和批量删除提供了支持,能够直接执行批量更新或批量删除语句,无需把被更新或删除的对象先加载到内存中。以下是通过Hibernate3.0执行批量更新的程序代码: Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); String hqlUpdate = "update Customer set name = :newName where name = :oldName"; int updatedEntities = s.createQuery( hqlUpdate ) .setString( "newName", newName ) .setString( "oldName", oldName ) .executeUpdate(); tx.commit(); session.close(); 以下是通过Hibernate3.0执行批量删除的程序代码: Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); String hqlDelete = "delete Customer where name = :oldName"; int deletedEntities = s.createQuery( hqlDelete ) .setString( "oldName", oldName ) .executeUpdate(); tx.commit(); session.close();

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

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

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

1.1.9 UserTypeCompositeUserType接口UserTypeCompositeUserType接口中都加入了一些新的方法,这两个接口被移到org.hibernate.usertype包中,用户定义的UserTypeCompositeUserType实现类必须实现这些新方法。 Hibernate3.0提供了ParameterizedType接口,用于更好的重用用户自定义的类型。

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

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

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