Hibernate高官专访:谈Hibernate 3.2

Steve Ebersole是JBoss公司的首席软件工程师,他与1977年出生的法国人Emmanuel Bernard一起领导着Hibernate项目。随着Hibernate 3.2发布后,记者对Ebersole进行了专访,这位Hibernate项目的领导人谈了Hibernate 3.2的新功能,以及对EJB 3持久化框架的支持,还有即将推出的Hibernate功能。

     Frank SommerSteve Ebersole是artima网站的高级编辑,为了能让大家好的了解访谈的内容,我们IT168技术频道特翻译此文与各位读者一起分享,看看Steve Ebersole在这次访谈中都说了什么? 

新工具的特性

     Frank SommerSteve Ebersole:从最初的只有Hibernate Core,发展到现在的除了Hibernate Core外,还有Hibernate Annotation、Hibernate EntityManager和Hibernate Tools等众多工具。您能给我们简单介绍一下这些工具的情况,以及它们之间存在什么样的联系吗?在Hibernate 3.2中,这些工具有什么新的内容吗?

    Steve Ebersole:正如以前一样,Hibernate Core可是说人们通常说的Hibernate,它提供了具备完整功能、以及优秀性能的对象持久性映射(ORM)即持久层映射核心。Hibernate可以帮助开发者节省持久层编码时间,有助于面向对象的设计。Hibernate Core需要JDK1.3 以上或者支持J2EE 1.4、Java EE 5.0的应用服务器,其他软件包建立Hibernate Core核心提供的功能之上。

     Hibernate Annotation提供了JDK 5.0 代码标注的功能,从而替代XML元数据,通过使用Hibernate Annotation,能够减少描述符,编译期校验,以及减少配置和维护工作等。它们提供了其他XML元数据,提供了在XML元数据中不存在的一些功能,诸如Lucene和Validator等等。

     Hibernate EntityManager和Hibernte Annotation的一部分共同实现了Java 持久化编程接口,对象生命周期法则,以及JSR 220(也就是EJB 3.0)定义的查询选项。

JPA的支持情况

     Frank SommerSteve Ebersole
:从一个开发者的角度来看,除了JPA是一个Java标准外,直接使用Hibernate,或者把Hibernate作为一个JPA持久提供者(persistence provider)来使用,这两者之间的主要区别是什么?

     Steve Ebersole:从一个开发者的角度,我们应该需要讨论一下应用程序接口(API)设置。在基础应用程序接口(API)操作方面,这两者几乎没有什么不同。

    例如,EntiyManager和Hibernate Session都提供名为merge()的方法,并且定义了完全相同的行为,这种情况还有很多。主要的应用程序接口区别在于访问Hibernate的高级功能,这在JPA中是没有定义的。

    例如,Hibernate中定义了一个方法,允许开发者管理持久化上下文的大小。这是一个非常重要的功能,尤其是当我们需要存在长时间的扩展,并且持续增长的持久化上下文的大小的时候。

     而且,一般来说,JPA为每一种类型的操作定义一个语义。假如我有一个描述分离状态的实体,在JPA中,我需要利用merge()或lock()来重新关联状态,但是,Hibernate提供merge()、lock()、update()、saveorupdate()、saveorupdatecopy()或者replicate()等方法来取代JPA中的重新关联状态,两者中所有处于分离状态的操作具有细微的语义区别。

     Frank SommerSteve Ebersole:除了在管理分离对象的语义方面的区别,还有其他Hibernate功能目前在JPA中不支持吗?或者有JPA功能目前在Hibernate中不被支持吗?

     Steve Ebersole:Hibernate完全实现了JPA规范,包括所有可选的行为。至于JPA中不具备的Hibernate的功能,实际上还是有一些的, Query-by-Criteria/Query-by-Example可能是最大的缺少的功能。

      还有一个我刚才提到的,控制一个持久化上下文中管理状态的大小,是另一个Hibernate支持的功能,但是在JPA中没有被规范来定义它;还有定义任何类的缓存语义的共享状态功能在JPA中也根本没有。

      同样,Hibernate具有一套非常强大和灵活的类型系统,而JPA只定义了一小部分的对象类型转化库。

HIbernate强大的功能

     Frank SommerSteve Ebersole:Annotations是一个非常方便的功能,用来详细说明持久层相关的功能。那么有没有情况会让你推荐开发者使用XML映射文件呢?

     Steve Ebersole:首先,我想指出这不是一个非此即彼的选择题。用户可以混合和搭配使用代码标注(annotations)和XML映射功能。不过,有两种情况,用户需要使用XML。

     第一种情况是,用户在使用“实体名称”的时候,这个功能可以让你能够同时映射一个给定的POJO类到多个实体名称。这对于代码标注(annotations)是不可能的,因此你需要使用XML映射实体之一来实现。

     第二种情况是,用户在使用Hibernate的“实体模式”功能的时候。这同样对代码标注(annotations)是不可能的,因为它假定你正在使用POJO。

      Hibernate的实体模式的思想是能够以不同方式描述你的域模型。例如,Hibernate支持一个DOM4J实体模式。当你使用DOM4J实体模式的时候,请求Hibernate来为你从数据库中取出一些东西,你所取回的是一个org.dom4j.Element,POJO就是Hibernate的另一种实体模式。

     除了实体名称和实体模式外,就完全依靠个人喜好了。

     Frank SommerSteve Ebersole:说到代码标注(annotations),那么在Hibernate Annotations和在JPA规范中规定的持久性相关的代码标注(annotations)之间,有什么区别?

     Steve Ebersole:区别就是范围大小的问题,JPA通常借助于它的代码标注(annotations)来定义对象/相关性映射架构的一个子集,它定义了一个人想要实现对象持久化的最小的映射架构。

     但是,Hibernate Annotations反映了强大的Hibernate功能,例如批量抓取、精选抓取、联合子集映射、类型映射、缓存语义映射等等,这是JPA所不具备的。加上我已经提到的,Hibernate Annotations还包含超出Hibernate Core所能提供的强大的行为。

     Frank SommerSteve Ebersole:能透露一点关于与Lucene整合的情况吗?

     Steve Ebersole:这个工作是由Emmanuel Bernard领导的,它建立在Hibernate Annotations和Hibernate Core的事件框架之上,其指导思想是托管基于域实体状态的Lucene目录的维护给基于持久性事件的Hibernate。

     一旦你更新或删除或插入一个新的实体,Hibernate根据这些操作来启动事件,这样Lucene综合监听器开始执行任何所需要的对Lucene目录的动作。整个计划的漂亮之处是解决方案的简单性:你可以从你的域类的一些注解和Hibernate配置的一些额外的内容中得到全部功能。

     Frank SommerSteve Ebersole:你计划在下一个版本的Hibernate中增加什么有有趣的功能?

      Steve Ebersole:我正在研究更多的新的HQL功能,例如ad-hoc联合语法和UNION/MINUS查询。

      我还在重新研究如何让Hibernate本身与JDBC对话,我们会根据试验结果来决定是不是对消费者用户提供这个功能,作为靠Hibernate会话来访问JDBC的一种可行的选择。

     我仍然继续扩展实体模式的功能,在使其更加易用的同时,增加新的标准模式。

     Hibernate Lucene和Hibernate Validatator方面,我们也将继续增加功能设置。 

  原文链接: http://www.artima.com/forums/flat.jsp?forum=276&thread=182271

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值