尽管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.Hibernate API 变化
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。
2) org.hibernate.classic包
Hibernate3.0把一些被废弃的接口都转移到org.hibernate.classic中。
3)Hibernate所依赖的第三方软件包
在Hibernate3.0的软件包的lib目录下的README.txt文件中,描述了Hibernate3.0所依赖的第三方软件包的变化。
4)异常模型
在Hibernate3.0中,HibernateException异常以及它的所有子类都继承了java.lang.RuntimeException。因此在编译时,编译器不会再检查HibernateException。
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执行批量更新的程序代码:
1. Session session = sessionFactory.openSession();
2. Transaction tx = session.beginTransaction();
3. String hqlUpdate = "update Customer set name = :newName where name = :oldName";
4. int updatedEntities = s.createQuery( hqlUpdate )
5. .setString( "newName", newName )
6. .setString( "oldName", oldName )
7. .executeUpdate();
8. tx.commit();
9. session.close();
以下是通过Hibernate3.0执行批量删除的程序代码:
1. Session session = sessionFactory.openSession();
2. Transaction tx = session.beginTransaction();
3. String hqlDelete = "delete Customer where name = :oldName";
4. int deletedEntities = s.createQuery( hqlDelete )
5. .setString( "oldName", oldName )
6. .executeUpdate();
7. tx.commit();
8. session.close();
6) createSQLQuery()
在Hibernate3.0中,Session接口的createSQLQuery()方法被废弃,被移到org.hibernate.classic.Session接口中。Hibernate3.0采用新的SQLQuery接口来完成相同的功能。
7)Lifecycle 和 Validatable 接口
Lifecycle和Validatable 接口被废弃,并且被移到org.hibernate.classic包中。
8)Interceptor接口
在Interceptor 接口中加入了两个新的方法。用户创建的Interceptor实现类在升级的过程中,需要为这两个新方法提供方法体为空的实现。此外,instantiate()方法的参数作了修改,isUnsaved()方法被改名为isTransient()。
9)UserType和CompositeUserType接口
在UserType和CompositeUserType接口中都加入了一些新的方法,这两个接口被移到org.hibernate.usertype包中,用户定义的UserType和CompositeUserType实现类必须实现这些新方法。
Hibernate3.0提供了ParameterizedType接口,用于更好的重用用户自定义的类型。
10)FetchMode类
FetchMode.LAZY 和 FetchMode.EAGER被废弃。取而代之的分别为FetchMode.SELECT 和FetchMode.JOIN。
11)PersistentEnum类
PersistentEnum被废弃并删除。已经存在的应用应该采用UserType来处理枚举类型。
12)对Blob 和Clob的支持
Hibernate对Blob和Clob实例进行了包装,使得那些拥有Blob或Clob类型的属性的类的实例可以被游离、序列化或反序列化,以及传递到merge()方法中。
13) Hibernate中供扩展的API的变化
org.hibernate.criterion、 org.hibernate.mapping、 org.hibernate.persister和org.hibernate.collection 包的结构和实现发生了重大的变化。多数基于Hibernate 2.1 的应用不依赖于这些包,因此不会被影响。如果你的应用扩展了这些包中的类,那么必须非常小心的对受影响的程序代码进行升级。
2. 元数据的变化
1)检索策略
在Hibernate2.1 中,lazy属性的默认值为“false”,而在Hibernate3.0中,lazy属性的默认值为“true”。在升级映射文件时,如果原来的映射文件中的有关元素,如、等没有显式设置lazy属性,那么必须把它们都显式的设置为lazy=“true”。如果觉得这种升级方式很麻烦,可以采取另一简单的升级方式:在元素中设置: default-lazy=“false”。
2)对象标识符的映射
unsaved-value属性是可选的,在多数情况下,Hibernate3.0将把unsaved-value="0" 作为默认值。
在Hibernate3.0 中,当使用自然主键和游离对象时,不再强迫实现Interceptor.isUnsaved()方法。如果没有设置这个方法,当Hibernate3.0无法区分对象的状态时,会查询数据库,来判断这个对象到底是临时对象,还是游离对象。不过,显式的使用 Interceptor.isUnsaved()方法会获得更好的性能,因为这可以减少Hibernate直接访问数据库的次数。
3)集合映射
元素在某些情况下被和元素替代。此外,Hibernate3.0用 元素来替代原来的.元素,用元素来替代原来的元素。
4)DTD
对象-关系映射文件中的DTD文档,由原来的:
http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd
改为:
http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd
3 查询语句的变化
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
提示:
ANTLR是用纯Java语言编写出来的一个编译工具,它可生成Java语言或者是C++的词法和语法分析器,并可产生语法分析树并对该树进行遍历。ANTLR由于是纯Java的,因此可以安装在任意平台上,但是需要JDK的支持。
Hibernate开发小组尽力保证Hibernate3.0的查询翻译器能够支持Hibernate2.1的所有查询语句。不过,对于许多已经存在的应用,在升级过程中,也不妨仍然使用Hibernate2.1的查询翻译器。
值得注意的是, Hibernate3.0的查询翻译器存在一个Bug:不支持某些theta-style连结查询方言:如Oracle8i的OracleDialect 方言、Sybase11Dialect。解决这一问题的办法有两种:(1)改为使用支持ANSI-style连结查询的方言,如 Oracle9Dialect,(2)如果升级的时候遇到这一问题,那么还是改为使用Hibernate2.1的查询翻译器。
1)indices()和elements()函数
在HQL 的select子句中废弃了indices()和elements()函数,因为这两个函数的语法很让用户费解,可以用显式的连接查询语句来替代 select elements(...) 。而在HQL的where子句中,仍然可以使用elements()函数
(说明一下:)来自于:http://it.100xuexi.com/ExtendItem/OTDetail.aspx?id=615d03ad-d1a8-48af-98e8-ee082e508afa
分享到:
相关推荐
本文将详细讲解Hibernate2和Hibernate3中如何配置连接池,以及官方推荐的C3P0、Proxool和DBCP等连接池的使用。 首先,我们需要了解的是,Hibernate2和Hibernate3对连接池的支持有所不同。在Hibernate2中,Apache的...
在Hibernate 3之前,实体类和它们与数据库表之间的映射通常通过XML配置文件(如hibernate.cfg.xml和.hbm.xml)来定义。然而,随着注解的引入,这些信息可以直接在Java类上声明,使得代码更加简洁、易读。 ### 2. ...
详细讲解hibernate的配置使用,以及简单例子
【标题】"MLDN_Hibernate开发实战讲解视频教程"涵盖了关于Hibernate框架的深入学习和实践应用,这是一款广泛用于Java企业级应用中的对象关系映射(ORM)工具。Hibernate简化了数据库操作,允许开发者用面向对象的...
在Java Web开发中,Struts2和Hibernate是两个非常重要的框架,它们分别负责MVC模式中的控制层和持久层。Struts2提供了强大的Action类和拦截器,使得业务逻辑处理更加简洁;而Hibernate则作为ORM(Object-Relational ...
本篇将通过实例和讲解来详细介绍 Hibernate Validation 的使用方法和核心概念。 **1. 安装与引入** 在 Maven 项目中,可以通过添加以下依赖来引入 Hibernate Validation: ```xml <groupId>javax.validation ...
Struts2、Hibernate3和Spring3是Java Web开发中的三个重要框架,它们分别负责MVC模式的展现层、持久层和业务层管理。将这三个框架整合在一起,可以构建出高效、灵活的企业级应用。下面我们将详细讲解在项目整合中所...
Struts2、Spring3和Hibernate3是Java Web开发中的三个重要框架,它们分别负责MVC模式中的Action层、业务逻辑层和服务数据访问层。在这个整合项目案例中,开发者通过将这三个框架结合,构建了一个功能完整的Web应用...
Ajax(Asynchronous JavaScript and XML)和Hibernate是两种在Web开发中广泛应用的技术。Ajax允许创建无需刷新整个页面就能更新部分网页的交互式应用,显著提升了用户体验。而Hibernate则是一个优秀的对象关系映射...
本文将深入探讨“精通Hibernate源码Chapter 3”的核心知识点,主要关注Java对象持久化技术和Hibernate的实现原理。 一、对象持久化 对象持久化是将内存中的对象状态保存到持久存储介质(如数据库)的过程,使得...
《企业应用架构设计-Struts2 Hibernate3 Spring 2》是谢星星撰写的一本经典书籍,专注于讲解如何在企业级应用程序中有效地整合这三个强大的开源框架。第十九章的主题是“Struts2 Hibernate3整合源码”,这涉及到...
3. **dom4j.jar**: 提供了XML处理的API,Hibernate使用它来读取和解析配置文件(如hibernate.cfg.xml),以及XML格式的映射文件(hbm.xml),是配置和管理Hibernate不可或缺的组件。 4. **odmg.jar**: ODMG(Object...
《孙卫琴精通Hibernate Part2》是一份深入学习Hibernate框架的教程,主要涵盖了该框架的高级特性和实战应用。在本教程的第二部分,我们将会更深入地探讨Hibernate的各个重要方面,帮助开发者提升数据库操作的效率和...
《轻量级Java_EE企业应用实战_Struts_2+Spring_3+Hibernate整合开发_第3版》这本书深入探讨了在Java EE环境下如何利用轻量级框架Struts 2、Spring 3和Hibernate进行高效的企业级应用开发。这三者结合在一起,形成了...
《Hibernate3 CHM格式中文》是一个专门为中文用户提供的关于Hibernate框架的离线帮助文档,它以CHM(Microsoft Compiled HTML Help)格式呈现,方便开发者在没有网络的情况下查阅和学习。Hibernate是一个开源的对象...
今天,我向大家讲解ajax与hibernate的结合,我们接着上次的ajax讲解来,便于快速上手! hibernate是什么呢? 是现在很火的一个持久化技术,简单的说就是一个对象与表的映射! 具体的细节,大家多看一些有关hibernate...
这份文档分为多个章节,深入讲解了 Hibernate 的核心概念、配置、实体映射、查询语言、缓存策略以及与 Spring 框架的集成等关键内容。 一、Hibernate 核心概念 Hibernate 提供了一个数据持久化的框架,将 Java 对象...