Hibernate3与Hibernate2区别
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 ? UserType和CompositeUserType接口 ? ?
? 1.1.10 ? FetchMode类 ? ?
? 1.1.11 ? PersistentEnum类 ? ?
? 1.1.12 ? 对Blob ? 和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.1的Java项目,可以很方便的把它升级到Hibernate3.0。 ?
? ?
? 本文描述了Hibernate3.0版本的新变化,Hibernate3.0版本的变化包括三个方面: ?
? (1)API的变化,它将影响到Java程序代码。 ?
? (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能够同时在同一个应用程序中运行。 ?
? ?
? 如果希望把已有的应用升级到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中内置的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所依赖的第三方软件包的变化。 ?
? ?
? 1.1.4 ? 异常模型 ?
? ?
? 在Hibernate3.0中,HibernateException异常以及它的所有子类都继承了java.lang.RuntimeException。因此在编译时,编译器不会再检查HibernateException。 ?
? ?
? 1.1.5 ? Session接口 ?
? ?
? 在Hibernate3.0中,原来Hibernate2.1的Session接口中的有些基本方法也被废弃,但为了简化升级,这些方法依然是可用的,可以通过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.1中Session的一些接口,可以采用以下方式创建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中,Session的delete()方法有几种重载形式,其中参数为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();