|
hibernate是一种强大的可提供对象-关系持久化和查询服务的中间件,它可以使程序员依据面向对象的原理开发持久化类,实现对象之间的关联、继承、多态、组合、集合等。
hibernate提供了它特有的数据库查询语言hql,这种查询语言屏蔽了不同数据库之间的差别,使你可以编写统一的查询语句执行查询。不同于其他持久化解决方案的是hibernate并没有把sql的强大功能屏蔽掉,而是仍然兼容sql,这使你以往的关系技术依然有效。
一、hibernate的版本更新情况
hibernate版本更新速度很快,目前为止有两个阶段性的版本:hibernate2和hibernate3,这一点程序员从其jar文件名便可以看出来。至本文写成之日最新发布的版本是hibernate3.4。
hibernate2系列的最高版本是hibernate2.1.8,hibernate3系列在编写本书时的最高版本是hibernate 3.2.5 ga版,ga也就是general availability,即推荐广泛使用的版本,但目前使用较多且较稳定的版本是hibernate 3.1.3或hibernat 3.1.2。
另外,自hibernate3发布以来,其产品线愈加成熟,相继出现了hibernate注释、hibernate实体管理器、hibernate插件工具等一系列产品套件。在方便程序员使用hibernate进行应用程序的开发的同时,也逐渐增强了hibernate产品线的实力。
但目前市面上用于学习hibernate开发的图书并不多见,大多是介绍老版的hibernate2,最近希赛和博文联手推出的《贯通hibernate开发》,对最新的hibernate3作了详尽的解答,推荐读者阅读。
二、hibernate3的新特性
hibernate3在产品的应用性上有了极大提高,并且基于java1.5进行了改进,且与ejb3.0进行了集成,在功能上有了很大的提升。同时,hibernate还对当今另一主流开发平台--微软的.net平台进行了支持,因此具有更加强大的生命力。
相对于hibernate2,hibernate3版本的变化包括三个方面:
(1)api的变化
api的变化中比较重大的变化是包名的变化,主要是包的根路径发生了改变,这一点程序员只需要在eclipse中查看hibernate3.jar这个文件中所包含的类就知道了:hibernate 3的根路径从hibernate2的net.sf.hibernate变成了org.hibernate。由于这两个路径完全不同,所以程序员能够在同一个应用程序中同时使用hibernate2和hibernate3。如果希望把已有的应用升级到hibernate3,那么升级的第一步是把java源程序中的所有net.sf.hibernate替换为org.hibernate。
另外,在hibernate3中,hibernateexception异常以及它的所有子类都继承了java.lang.runtimeexception。因此在编译时,编译器不会再检查hibernateexception。在hibernate3中,session接口的createsqlquery()方法被废弃,被移到org.hibernate.classic.session接口中。hibernate3采用新的sqlquery接口来完成相同的功能。在usertype和compositeusertype接口中也都加入了一些新的方法,这两个接口被移到org.hibernate.usertype包中,用户定义的usertype和compositeusertype实现类必须实现这些新方法。hibernate3提供了parameterizedtype接口,用于更好的重用用户自定义的类型。
以上的这些主要变化将会影响到应用程序,程序员必须要进行相应的调整,才能使基于hibernate3的应用程序正常运行。
(2)元数据
元数据主要是指hibernate映射文件中各种元素和属性的用法的变化。首当其冲的是hibernate映射文件的文档类型定义,即dtd文件发生了变化,这一点程序员可以从任何一个hibernate3的映射文件的文件头中发现,即在元素中定义的url从http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd变成了http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd。
还有一个重大的改变就是lazy属性的默认值从false变成了true,这也是hibernate从优化应用程序性能的角度出发所做出的决定。因为当lazy=false时,hibernate对所有字段都采取预先抓取的策略,如果程序员希望采用延迟加载,必须手工在映射文件中将lazy属性的值设为true,然而总是采用预先抓取策略势必会造成极大的资源占用,从而降低应用程序的性能。所以从应用程序的角度来讲,更希望lazy的默认值是true,这样在有需要的时候才去采用预先抓取的检索策略。
(3)hql查询语句
hibernate3 采用新的基于antlr的hql/sql查询翻译器,不过,hibernate2的查询翻译器也依然存在。在hibernate的配置文件中,hibernate.query.factory_class属性用来选择查询翻译器。
三、hibernate的发展趋势
hibernate是一个非常优秀的持久层解决方案。具有以下发展趋势:
(1)与其他开发框架的集成将越来越成熟:如与struts、spring、jbpm的集成,充分发挥hibernate自身的优势,也吸取了对方框架的优势,在软件系统的各个层各司其职。
(2)产品线的逐渐完善:通过增加若干的工具套件,并支持.net平台,使hibernate具有更强大的生命力。
(3)与ejb更好的集成:集成ejb,开始将重点转向重量级应用,使得hibernate在企业级应用中必将占据一席之地。
hibernate的轻量级 orm 模型逐步确立了在java orm架构中领导地位,甚至取代复杂而又繁琐的ejb模型而成为事实上的java orm工业标准。而且其中的许多设计均被j2ee 标准组织吸纳而成为最新ejb3.0规范的标准。
随着hibernate的广泛应用,越来越多的java中间件厂商和java项目(如jboss、jbpm等)开始把目光集中到hibernate上并将其纳入自身的体系,使hibernate具有了越来越广阔的发展前景。
|