`
zengjinliang
  • 浏览: 308917 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

hibernate2.1与hibernate3.0的区别

阅读更多
尽管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 =ldName";
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 =ldName";
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 接口

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()方法中。

1.1.13 Hibernate中供扩展的API的变化

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”。在升级映射文件时,如果原来的映射文 件中的有关元素,如<set>、<class>等没有显式设置lazy属性,那么必须把它们都显式的设置为lazy= “true”。如果觉得这种升级方式很麻烦,可以采取另一简单的升级方式:在<hibernate-mapping>元素中设置: 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 集合映射

< index>元素在某些情况下被<list-index>和<map-key>元素替代。此外,Hibernate3.0 用<map-key-many-to-many> 元素来替代原来的<key-many-to-many>.元素,用<composite-map-key>元素来替代原来的 <composite-index>元素。

1.2.4 DTD

对象-关系映射文件中的DTD文档,由原来的:
http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd
改为:
http://hibernate.sourceforge.net/hibernate-mapping-3.0.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.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.3.1 indices()和elements()函数

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

相关推荐

    Myeclipse8.5下搭建SSH框架(图解)Struts2.1+Spring3.0+Hibernate3.3

    本文将详细介绍如何在MyEclipse 8.5环境下搭建基于Struts2.1、Spring3.0以及Hibernate3.3的SSH框架,并通过图解的方式引导读者完成整个搭建过程。 #### 二、创建 Web 项目 首先,需要在MyEclipse 8.5中创建一个新...

    搭建Struts2.1+Spring3.0+Hibernate3.3框架

    搭建Struts2.1+Spring3.0+Hibernate3.3框架是开发Java Web应用程序时常见的一种技术组合,也被称为SSH框架。这三个框架分别负责不同的职责:Struts2处理前端控制器,Spring提供依赖注入和事务管理,Hibernate则作为...

    Struts2.1、Spring3.0、Hibernate3.3框架整合

    Struts2.1、Spring3.0、Hibernate3.3框架整合 Struts2.1、Spring3.0、Hibernate3.3框架整合 Struts2.1、Spring3.0、Hibernate3.3框架整合

    hibernate2.1

    《深入理解Hibernate 2.1:源码与实践》 Hibernate作为一款强大的对象关系映射(ORM)框架,自发布以来就受到了广大Java开发者们的热烈欢迎。本篇将重点探讨Hibernate 2.1版本,结合源码分析和实际应用,帮助读者...

    Myeclipse10下搭建SSH框架(图解)Struts2.1+Spring3.0+Hibernate3.3

    Myeclipse10下搭建SSH框架(图解)Struts2.1+Spring3.0+Hibernate3.3 该文件的内容来自网络,我搜集并整理供大家参考学习。

    struts2.1+hibernate3.3+spring3.0 示例

    Struts2.1、Hibernate3.3和Spring3.0是Java Web开发中非常重要的三个框架,它们分别负责MVC模式中的控制层、持久层和业务层管理。这个"struts2.1+hibernate3.3+spring3.0 BBS示例"是一个集成这三个框架的论坛应用...

    基于struct2.1 hibernate3.0 spring2.5 BBS系统

    其次,Hibernate3.0是一个强大的对象关系映射(ORM)框架,它简化了Java应用与数据库之间的交互。在BBS系统中,Hibernate3.0作为数据访问层,将数据库中的表映射为Java对象,使得开发者可以使用面向对象的方式来操作...

    struts2.1+spring3.0+hibernate3.3整合小例子

    ### Struts2.1 + Spring3.0 + Hibernate3.3 整合示例解析 #### 一、项目概述 本篇文章将详细解读一个基于Struts2.1、Spring3.0以及Hibernate3.3的整合项目案例。该案例不仅展示了如何搭建这样一个集成环境,还特别...

    MyEclipse8.6+Struts2.1+Spring3.0+Hibernate3.3环境搭建.doc

    本文档主要介绍了如何在MyEclipse 8.6环境中搭建一个基于Struts2.1、Spring3.0和Hibernate3.3的Java Web应用开发环境。以下是各个部分的详细说明: 1. 创建Web Project项目 在MyEclipse中创建Web Project是开始...

    MyEclipse、Struts2.1、Spring3.0、Hibernate3.3框架整合详细图解

    这里我们将探讨如何在MyEclipse环境中整合Struts2.1、Spring3.0和Hibernate3.3这三个主流的Java开源框架。这个过程包括数据库的设置、项目的创建、各个框架的添加以及配置文件的编写。 1. **数据库准备** - 使用...

    Struts2.1、Spring3.0、Hibernate3.3框架整合-用户登录示例(更新)

    Struts2.1、Spring3.0、Hibernate3.3框架整合-用户登录示例

    strruts2.1、Spring3.0、Hibernate3.3整合与S2SH的XML文件拆分.docx

    Struts2.1、Spring3.0和Hibernate3.3的整合是企业级Java应用开发中常见的技术组合,它们能够实现MVC(Model-View-Controller)架构,并且通过Spring管理业务逻辑和持久化层。S2SH是Struts2、Spring和Hibernate的简称...

    Struts2.1+Spring3.0+JPA1.0(Hibernate3.3实现)例子

    ### Struts2.1+Spring3.0+JPA1.0(Hibernate3.3实现)集成案例解析 #### 概述 本篇文章主要介绍如何将Struts2.1、Spring3.0以及JPA1.0(通过Hibernate3.3实现)进行集成开发的应用案例。这种集成方式在企业级应用开发...

    Struts2.1+Spring3.0+hibernate3.3全自动整合教程.doc

    同时,Spring3.0还支持与Hibernate的整合,可以将SessionFactory配置到Spring配置文件中,以便于管理数据访问。 **Hibernate3.3** 是一个流行的ORM(对象关系映射)框架,它允许开发者使用Java对象来操作数据库,...

    Struts2.1、Spring3.0、Hibernate3.3整合与S2SH的XML文件拆分

    Struts2.1、Spring3.0 和 Hibernate3.3 的整合是企业级Java应用开发中常见的技术组合,常被称为S2SH框架。这个整合旨在实现MVC(Model-View-Controller)架构,以提高应用的可维护性和可扩展性。下面我们将详细探讨...

    struts2.1+spring3.0+hibernate3.3整合

    ### Struts2.1 + Spring3.0 + Hibernate3.3 整合实践 #### 一、项目背景与概述 在Java Web开发中,Struts2、Spring与Hibernate是三个非常重要的框架,它们分别用于处理MVC架构中的表示层、业务逻辑层与数据访问层...

    Struts2.1、Spring3.0、Hibernate3.3框架整合详细图解

    SSH框架整合是Java开发中常见的技术栈,包括Struts2.1、Spring3.0和Hibernate3.3这三个组件。它们分别负责表现层、业务层和数据持久化层的功能,协同工作以构建一个完整的MVC(模型-视图-控制器)架构的应用程序。 ...

    Struts2.1、Spring3.0、Hibernate3.3框架整合源码

    Struts2.1、Spring3.0和Hibernate3.3是经典的Java Web开发框架组合,它们在企业级应用中广泛使用。这个压缩包文件可能是为了演示或教学这三大框架的整合,以及如何与MySQL数据库进行交互。下面我们将深入探讨这三个...

    MyEclipse-10.0下Struts2.1+Spring3.0+Hibernate3.3整合过程+源码

    Struts2.1、Spring3.0和Hibernate3.3是Java Web开发中经典的MVC框架集合,通常被称为SSH(Struts2、Spring、Hibernate)框架。这些框架的整合能够帮助开发者实现高效的业务逻辑处理、数据持久化以及灵活的控制流程。...

Global site tag (gtag.js) - Google Analytics