- 浏览: 189984 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
syzyaccp:
其实也可以用下面的转译,就是xml的特殊符号,因为它的配置就是 ...
ibatis如何写小于等于 -
zjx158:
感谢楼主分享
flex air + java -
damoguying518:
楼主,麻烦问一下,关于第四个描述,我现在也不想要节点的双击效果 ...
Birdeye 中文支持 -
zhousheng_quiz:
写类似的构造边的类
Birdeye 中文支持 -
pangxin12345:
代理方式, 只要域配置文件为*就可以了!
Flex 沙箱问题解决与安全问题的全面解析
Hibernate2.1升级到Hibernate3.0
如何把
Hibernate2.1
升级到
Hibernate3.0
?
选自
<<
精通
Hibernate
:
Java
对象持久化技术详解
>>
作者:孙卫琴
来源
:www.javathinker.org
如果转载,请标明出处,谢谢
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();
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()
函数。
发表评论
-
反射获取泛型类型
2015-10-09 17:06 722Method app = T ... -
JAVA nio 学习笔记
2013-03-08 16:27 1013闲着没事学习了一下nio ... -
java 直连 JNDI
2013-01-25 10:02 1038B Using the WebLogic JarBuil ... -
CRM1.0工单割接到2.0全过程经验总结,此文章献给所有为2.0努力奋斗的人。
2013-01-13 17:25 1240经历过一个半月的征战,项目完工。只有身在其 ... -
split方法和转义字符
2012-04-11 15:59 1388public class split { publi ... -
ibatis如何写小于等于
2011-12-23 14:37 10370由于Ibatis的sql是写在配置文件里面,但解析xml时出现 ... -
Hessian学习笔记
2011-06-23 16:01 20691.Hessian 介绍 Hessia ... -
网页变灰
2011-04-26 17:19 733body,td,tr,img,div,a,h1,h2,h3 ... -
四舍五入代码
2011-04-25 11:11 1174public static double seanRound ... -
Vector使用常见错误
2011-04-12 15:54 1212java.lang.ArrayIndexOutOfBounds ... -
经常用到的时间处理方法(java)
2011-03-17 09:36 922/** 日期类 * @date * @ver ... -
配置虚拟目录
2010-08-05 14:09 949tomcat5.5配置: 如果tomcat5.5安装在D:\ ... -
Spring 学习笔记
2010-04-16 18:05 1023所谓控制反转就是应用 ... -
arrayList 去重复
2010-03-23 09:31 2270去掉重复基本代码 public ArrayList diff ... -
闲着没事,分析include
2010-03-18 21:09 967include 指令: 静态包含,一个包含任意格式的 ... -
ejb3 学习笔记,备忘用地
2010-03-17 12:23 933java bean 类型: Session Be ... -
ibatis 学习笔记
2010-03-17 10:30 982<setting>元素 maxRequest同时 ... -
jdbc 连接数据库
2010-03-10 08:57 990Java数据库连接(JDBC)由一组用 Java 编程语言编写 ... -
java反射笔记
2010-03-03 15:47 1035package com.tjpu.helen.test; i ... -
java调用Exe文件
2010-03-03 14:00 1325package com.tjpu.helen.test; p ...
相关推荐
比较hibernate2与3的区别,归纳的较为详细
Hibernate作为一款强大的对象关系映射(ORM)框架,自发布以来就受到了广大Java开发者们的热烈欢迎。本篇将重点探讨Hibernate 2.1版本,结合源码分析和实际应用,帮助读者深入理解其设计理念和核心功能。 1. **ORM...
本文将详细介绍如何在MyEclipse 8.5环境下搭建基于Struts2.1、Spring3.0以及Hibernate3.3的SSH框架,并通过图解的方式引导读者完成整个搭建过程。 #### 二、创建 Web 项目 首先,需要在MyEclipse 8.5中创建一个新...
《基于Struct2.1 Hibernate3.0 Spring2.5的BBS系统详解》 在信息技术领域,构建一个高效、稳定且功能丰富的BBS(Bulletin Board System,电子公告板)系统是一项重要的任务。本系统是基于Struct2.1、Hibernate3.0和...
2. **Hibernate框架(3.0版本)**:Hibernate是一个对象关系映射(ORM)框架,它允许开发者用Java对象来操作数据库记录,降低了数据库操作的复杂性。在3.0版本中,Hibernate增强了对JPA(Java Persistence API)的...
搭建Struts2.1+Spring3.0+Hibernate3.3框架是开发Java Web应用程序时常见的一种技术组合,也被称为SSH框架。这三个框架分别负责不同的职责:Struts2处理前端控制器,Spring提供依赖注入和事务管理,Hibernate则作为...
Struts2.1、Spring3.0和Hibernate3.3是经典的Java企业级开发框架组合,通常被称为S2SH框架。这个JAR包包含了这三个框架的特定版本,用于构建基于Java的Web应用程序。以下是关于这些框架及其组合使用的详细知识点: ...
Struts 2.1、Spring 3.0 和 Hibernate 3.2 是经典的Java Web开发框架组合,被称为SSH(Struts-Spring-Hibernate)集成。这个"网上书店"项目是基于这三个框架构建的一个完整的Web应用程序,它展示了如何将这些技术...
Struts2.1、Spring3.0、Hibernate3.3框架整合 Struts2.1、Spring3.0、Hibernate3.3框架整合 Struts2.1、Spring3.0、Hibernate3.3框架整合
Struts2、Spring3.0和Hibernate3.5是Java Web开发中三个非常重要的框架,它们各自负责不同的职责,组合起来可以构建出高效、松耦合的Web应用程序。以下是对这三个框架及其集成使用的详细说明: **Struts2** 是一个...
Myeclipse10下搭建SSH框架(图解)Struts2.1+Spring3.0+Hibernate3.3 该文件的内容来自网络,我搜集并整理供大家参考学习。
SSH2则是Struts2、Spring2.5和Hibernate3.0的集成版本,这是一套非常经典的后端技术栈,用于构建高效、灵活的企业级应用程序。在本示例中,SSH2与MySQL数据库结合,为开发者提供了一个完整的MVC(模型-视图-控制器)...
### Struts2.1 + Spring3.0 + Hibernate3.3 整合示例解析 #### 一、项目概述 本篇文章将详细解读一个基于Struts2.1、Spring3.0以及Hibernate3.3的整合项目案例。该案例不仅展示了如何搭建这样一个集成环境,还特别...
本文档主要介绍了如何在MyEclipse 8.6环境中搭建一个基于Struts2.1、Spring3.0和Hibernate3.3的Java Web应用开发环境。以下是各个部分的详细说明: 1. 创建Web Project项目 在MyEclipse中创建Web Project是开始...
这里我们将探讨如何在MyEclipse环境中整合Struts2.1、Spring3.0和Hibernate3.3这三个主流的Java开源框架。这个过程包括数据库的设置、项目的创建、各个框架的添加以及配置文件的编写。 1. **数据库准备** - 使用...
### Struts2.1 + Spring3.0 + Hibernate3.3 整合实践 #### 一、项目背景与概述 在Java Web开发中,Struts2、Spring与Hibernate是三个非常重要的框架,它们分别用于处理MVC架构中的表示层、业务逻辑层与数据访问层...
Struts2.1、Spring3.0和Hibernate3.3是Java Web开发中经典的MVC框架集合,通常被称为SSH(Struts2、Spring、Hibernate)框架。这些框架的整合能够帮助开发者实现高效的业务逻辑处理、数据持久化以及灵活的控制流程。...
在文件列表中的"struts2.1+hibernate3.3+spring3.0留言示例"可能包含的是论坛的留言功能实现,这通常涉及到一个Message或Comment实体类,以及相关的Service和Action。用户可以发布、查看、编辑或删除留言,这些操作...
2. DmDialect-for-hibernate2.1.jar 对应 Jdk1.4及以上, hibernate2.1 -- 2.X 环境 3. DmDialect-for-hibernate3.0.jar 对应 Jdk1.4及以上, hibernate3.0 环境 4. DmDialect-for-hibernate3.1.jar 对应 Jdk1.4及以上...