实体CMP-EJB和Hibernate的比较

J2EE领域热切的盼来了一种非常流行的开源技术,它就是Hibernate。这个技术被提升到JCP(一种Java规范组织)标准中去了。从J2EE开发者反馈的信息来看,掌握Hibernate知识是所有想在J2EE领域有所作为的人的必修课。

Hibernate是一个对象关系映射的技术。它是一个开源,并且免费的技术,由SourceForge. Net开发。在过去,有许多的类似的对象关系映射技术。TopLink就是这样的一种工具,后来被Oracle所采用。来自SourceForge的Hibernate和Apache的OJB也都是非常知名的对象关系工具,开源并且免费。JDO也要被归为这一类。

Gavin King是Hibernate的负责人,而Craig Russell 和David Jordan是JDO的主要设计者,JDO是由SUN牵头做的。由于一些技术的原因,今天JCP规范中的大多数成分有利于Hibernate,而不是JDO。从表面上它们没有什么区别,语法和一些处理方法看起来大多数相同,但是,Hibernate的语法更简单易学。

非常有趣的是Craig Russell为SUN工作,而Gavin King 为JBoss工作。资料表明JCP是一个非常民主的社区组织,SUN并没有强制规定一些条条款款,保护自己的语言和企业级的用户。

EJB-3是目前最新的版本,很大程度上受到了Hibernate的影响。一些读者将EJB-3 和Hibernate等同起来。Oracle支持EJB-3提议,而它是j2ee领域中重要的数据库公司,那么EJB-3前景就会很好。从J2EE这个名字本身,就能看出它是一种企业级的技术,并且EJB本质上就是针对这些企业级的应用,由于存在提供的内置容器服务,只有Hibernate和EJB联合使用,Hibernate才能凸显其重要性,因此Hibernate转向到EJB是不可避免的。

EJB有三种类型的Bean。一种类型是会话Bean,存在于企业容器中,可以被认为是一种功能Bean,以RMI-IIOP方式调用。

ORM工具有时和会话Bean一起使用。最近主要的问题是过去ORM工具具有所有权的、价格昂贵的问题。但是现在,可靠、开源的ORM工具可以得到,并且Richard Monson Haefel承认使用ORM工具,替代实体bean,是一种非常安全、并且很有开发效率的方法。

另外一个类型实体Bean就没有这么走运了。EJB-1. 1、 EJB-2. 0和随后的EJB-2. 1在关于实体Bean规范方面做了许多的改变。

我们能够说实体bean是一个“Attribute bean”或者'property-bean',带有setter 和getter方法,以RMI-IIOP方式调用,存在于企业容器中。定义一个Javabean的方式是Java中经常提到的话题。同样的方式也要出现在BDK,、EJB-Entity beans,、Struts、JSF 和现在的Hibernate技术中。所以,如何定义Javabean是非常重要并且很有艺术性的。

第三中类型就是通信和MDB。从企业这两个字就看出这里面应用程序里面涉及了很多的用户和并发事务,RPC形式非常像打电话,容易导致“占线”问题。如果你所呼叫的人正在给别人的打电话,那么这个时候就导致了线路阻塞。但是,通信的样式中,如在email中,至少要保证信息发送出去。很明显RPC是不合适的,被夸大了。有时,我需要即时响应。由于一些原因,即使像XML web服务,如果问题很严重的话,也应该采用同新样式。MDB(消息驱动bean)事实上越来越被接受。

因此,为什么单单实体bean发现不合格,并且规范老在变呢?

实体bean有两种类型。CMP和BMP两种。

CMP指的是容器管理持久化,而BMP指的是Bean管理持久化。理论上说,EJB规范并没有规定你采用何种方法来持久化你的对象。你也可以简单的将对象串行化。数据库可以是对象数据库或者是关系对象数据库,或者是XML的。但是,在实际中,数据库经常是指关系数据库,使用SQL。

在CMP中,编码员只是在存储器中处理对象。创建新对象,修改它们,删除它们,和查询它们,所有都是在存储器中进行的。保存这些对象到关系数据库表格中去的任务由容器自动完成。编码员不需要些任何的与SQL相关的代码。

在BMP中,编码员不得不写SQL语句来持久化对象到关系数据库中。

EJB1. 1版本的CMP适合简单的表格,和其它的表格没有复杂的关系。CMP避免对底层数据库的引用。因此,它是很具有可移植的。CMP除了能将数据库持久化到关系数据库中之外,还能持久化到对象数据库中去。

但是,CMP并不是适合所有的情况。如果数据库是先前遗留的类型的话,如不能使用SQL,数据库公司提供了自己的代码来持久化,并且这些代码在我们的编程中用来持久化数据,这样的情况就不适合了。

但是,真正的问题在于CMP使用了ORM概念,虽然很多的实现迫切需要。它并没有暴露EJB开发商到底实现了多少规范。Weblogic, Oracle, IBM WebSphere, SUN , JBoss都是实现了CMP中他们认为适合的部分。使用CMP是不错的,并不仅仅因为它使得代码可移植,很容易写。如果我们采用CMP,更多的原因是EJB容器能够极大优化性能。因此开发社区希望采用CMP,但是发现CMP不适合复杂的任务。

虽然做了一些改进,但是发现CMP不能成为最终的解决方案。它里面没有继承性。

虽然EJB容器所提供的服务在真正大的企业级的应用程序中是不可或缺的,但是J2EE阵营仍让垂直的划分为两个层,Web层和EJB层。支持Web层的声称EJB的陡峭的学习曲线和容易发生错误的开发环境对于大多数的应用程序是不需要的。他们喜欢有一个对象关系映射工具构建到J2EE规范中。并不是只有在EJB存在ORM任务,甚至在Servlets、JSP也在使用他们,只不过J2EE规范没有对此做规定。ORM工具如OJB, JDO 和 Hibernate不只是能够用在EJB容器,还可以用在web容器和一个独立的容器中。使用这样的工具,J2EE标准就会使得开发任务简单,无论是开发web层的应用程序还是ejb层的应用程序。

在严厉的攻击EJB实体Bean的复杂性和性能时,Rod Johnson预言在今后几年,J2EE将会终止EJB的使用。无论我们同不同意他的观点,我们还是很有价值去看看他对EJB实体Bean的一些批判。他提议将Spring框架作为EJB容器的替代品,并且这个观念影响力正在扩大。

时间: 2024-12-30 05:43:35

实体CMP-EJB和Hibernate的比较的相关文章

JSP+STRUTS+EJB+DAO+HIBERNATE实例

js 例子只是一个简单的登录测试. JSP调用STRUTS的ACTION,然后在ACTION中调用EJB,EJB中的DAO调用HIBERNATE,用了JBOSS的数据库连接池. 数据库为MYSQL. 包里面有test.sql数据库表结构,导入到MYSQL就可以了. mysql-db.xml配置数据库连接池,和EAR放到同一个DEPLOY目录下. 运行JBOSS就可以了.我要的版本是3.2.5 具体配置见:http://www.bcxy.com/java/eclipsej2ee.htm 注意:我在

struts2 jsf jpa ejb spring hibernate 都有什么区别?

问题描述 struts2jsfjpaejbspringhibernate可以组成几种开发框架,例如ssh.并且每种组合在安全稳定方面,运行速度效率,开发的复杂程度方面,有什么区别,详细点,谢谢.

springmvc+hibernate 实体类映射错误

问题描述 springmvc+hibernate 实体类映射错误 type Exception report message Request processing failed; nested exception is org.hibernate.hql.ast.QuerySyntaxException: Users is not mapped [from Users u where u.loginName='ss' and u.password='aa'] description The se

hibernate映射实体类路径问题

问题描述 hibernate映射实体类路径问题 我建了一个source fold 命名src/main/java,里面建了一个包entity,entity里面有2个实体类 现在在hibernate.cfg.xml中 class路径改怎么写? 在线等

JSF+Spring+Hibernate的实例讲解

js 使用JavaServer Faces(JSF).Spring Framework和Hibernate建立一个真实的Web应用程序内容概要使用JSF建立一个真实的Web应用程序不是没有意义的任务,这篇文章介绍了如何将JSF与Sping Framework和Hibernate集成,并且给出了使用这些技术建立这个真实的Web应用程序的最佳实践和设计指导 JavaServer Faces(JSF)技术是J2EE应用程序的一个新的用户接口框架,它非常适合基于MVC(Model-View-Contro

EJB 3.0+Beehive开发客户反馈系统

设计目标 客户反馈系统作为公司与客户交流的平台,几乎为所有的企业所运用,最近,公司让我负责客户反馈系统的开发.由于,公司与国外客户的业务需要,该系统必须实现中,英,日三国语言的切换(国际化要求).在接到任务之后,我便决定尝试使用目前开源社区比较流行的Apache Beehive(蜂巢)和下一代EJB,EJB3.0等技术来实现这个系统. 开发环境 选择平台,开发工具 为了支持EJB3.0和Beehive,我们选择JBoss4.0.3应用服务器作为运行平台,它也是目前唯一提供EJB3.0容器的应用服

EJB学习之入门初探篇-EJB技术的发展史

greennetboyapril 09,2005文章内容1.什么是EJB2.EJB的产生3.EJB的发展4.EJB的发展前景(1)什么是EJBEJB是Enterprise JavaBeans的缩写,是生成生成业务应用的主要分布式组件模型.具体上说,EJB使业务逻辑实现与系统级服务分开,从而使开发人员可以集中考虑手头的业务问题.从技术上来说,EJB是Java服务器端服务框架的规范,它描述了在构建组件的时候所需要解觉得一系列问题,如可扩展(Scalable).分布式(distributed).事务处

Ibatis VS Hibernate

近日,在JavaEye论坛中,看了Ibatis和Hibernate的帖子,看后,心里觉得的憋闷,不说不快, 这里 ,我想更细化一下: 1. 库表的复杂度,首先取决于需求,不取决于设计,设计能力强的人,也要遵守库表设计的规范,从 巴克斯三个范式上,原则上也要遵守.不能说用了Hibernate,自己的库表设计能力就强了.不能为了用 Hibernate,就去一味批判复杂的关系不对.复杂的关系设计对不对,首先取决于是否有复杂的需求,其 次才取决于设计者的能力. 2. 只要你用的是关系数据库,就必须要明白

系统学习hibernate之六:一对一外键关联映射双向关联

hibernate一对一唯一外键关联映射(双向关联Person<---->IdCard) 一对一唯一外键关联双向,需要在另一端(idcard),添加<one-to-one>标签,指示hibernate如何加载 其关联对象,默认根据主键加载person,外键关联映射中,因为两个实体采用的是person的外键维护的关系, 所以不能指定主键加载person,而要根据person的外键加载,所以采用如下映射方式: <one-to-one name="person"

设计模式在EJB中的应用

什么是设计模式 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样. GoF的"设计模式"是第一次将设计模式提升到理论高度,并将之规范化,本书提出了23种基本设计模式,自此,在可复用面向对象软件的发展过程中,新的大量的设计模式不断出现. 设计模式和框架 现在,可复用