首页 > 其他分享 >如何把Hibernate2.1升级到Hibernate3.0

如何把Hibernate2.1升级到Hibernate3.0

时间:2023-06-08 21:01:11浏览次数:75  
标签:Hibernate2.1 1.1 Hibernate3.0 接口 升级 hibernate Session org


如何把Hibernate2.1升级到Hibernate3.0?

选自<<精通Hibernate:Java对象持久化技术详解>> 作者:孙卫琴

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()函数。

标签:Hibernate2.1,1.1,Hibernate3.0,接口,升级,hibernate,Session,org
From: https://blog.51cto.com/u_16065168/6443283

相关文章

  • Hyper-V RC1 升级补丁安装记 转贴
    惭愧啊,本blog很久不更新,都长草了。最近几个月实在忙得厉害,今天抽出1个小时更新一下最近的流水账吧。由于工作环境的需要和出于对新技术的追求,最近我一直在研究基于硬件级别的虚拟机,说是研究,实际上还停留在很肤浅的应用层次。研究的对象是WindowsServer2008里面的Hyper-V虚拟机......
  • 深度学习训练环境bug——【skimage升级到19之后的接口问题】
    skimage即是Scikit-Image。基于python脚本语言开发的数字图片处理包,比如PIL,Pillow,opencv,scikit-image等。PIL和Pillow只提供最基础的数字图像处理,功能有限。opencv实际上是一个c++库,只是提供了python接口,更新速度非常慢。scikit-image是基于scipy的一款图像处理包,它将图片......
  • Java面试题查缺补漏习题,锁的升级,动态代理
    之前我们总结了Java面试题目中的关于计算机网络,操作系统,以及JVM虚拟机,以及Java的相关特性。今天又看了很多面试的视频,对面试的题目进行一下仔细的补充。1.对称加密与非对称加密的区别:非对称加密和对称加密在加密和解密过程、加密解密速度、传输的安全性上都有所不同,具体介绍如下:......
  • k8s~RKE的方式升级Rancher集群
    kubectl安装在主机或者远程访问的笔记本上安装kubectl命令行工具rancher-cluster.yml(RKE配置文件)通过RKE创建kubernetes集群,需要预先设置rancher-cluster.yml配置文件,通过这个配置文件安装kubernetes集群,同时可以指定kubernetes的版本。RKE安装kubernetes集群后,会在RKE二进......
  • 鸿蒙来啦---如何升级到鸿蒙2.0
    嚯嚯嚯注意,你访问页面的时候,一定会有点卡顿,因为升级的人实在太多太多啦!!!鸿蒙2.0正式来啦,小伙伴们一定很想知道正确的升级步骤吧,笔者也是摸索了好几分钟呢。第一步进入我的华为,点击立刻尝鲜,再进入公测尝鲜。选择对应的机型,报名公测拉到帖子的最下方,点击参加公测活动。签署华为公测......
  • 解决Ubuntu 20.04升级后gnome-control-center设置程序无法打开问题
    解决Ubuntu20.04升级后gnome-control-center设置程序无法打开问题Ubuntu20.04系统升级后,发现gnome设置程序无法正常打开了。在终端运行命令查看错误信息,运行以下命令:sudognome-control-center从显示的错误信息可以看出,其调用的一些so文件,需要高版本的libc6,而Ubuntu20.0......
  • CodeGeeX 2.0版本重大升级:通过聊天对话的方式直接操作代码
    CodeGeeX2.0版本正式上线!从命名上看这是一次大版本的升级。上个月,CodeGeeX在VSCode和JetBrainsIDEs的插件中,加入了智能问答(AskCodeGeeX)功能,让用户可以在IDE中通过问答对话的方式解决技术问题。本周,这一功能全新升级!在CodeGeeX2.0正式版中,将问答与IDE编程环境深度融合,可以通过......
  • 圆满收官!飞桨黑客松第四期高手云集,四大赛道开源贡献持续升级
    2023年2月20日PaddlePaddleHackathon飞桨黑客马拉松(以下简称为“飞桨黑客松”)第四期活动发布后,开发者们反响热烈,围绕四大赛道展开了激烈角逐,超过2000+位社区开发者参与到飞桨黑客松中,完成800+余次任务认领&PR提交,200+个任务被认领,历经三个月脑力激荡的Hack时光,共有80+个团队突出......
  • 绩效考核到底是要留存、摒弃还是再升级?
    绩效考核的初衷是好的,是为了让员工的工作更有目标性,从而让公司更健康地发展。但是,很多时候,我们忘记了绩效考核的初衷,只为了考核而考核,最后导致绩效考核成了员工眼中的“鸡肋”,食之无味,弃之可惜。点击领取绩效学习资料 所以,我们需要摒弃的是为了考核而考核的思想,树立起以绩效......
  • Ubuntu升级Cmake的正确方式
     Ubuntu升级Cmake的正确方式某些软件包编译时需要高版本的Cmake,因此需要升级Cmake。不能使用sudoapt-getremovecmake卸载低版本cmake后再重装高版本,这样做会导致之前编译和安装的很多库一起被卸载!!! 正确步骤是:去https://cmake.org/files/下载所需版本的源码。也可......