JEE领域热切的盼来了一种非常流行的开源技术它就是Hibernate这个技术被提升到JCP(一种Java规范组织)标准中去了从JEE开发者反馈的信息来看掌握Hibernate知识是所有想在JEE领域有所作为的人的必修课
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是目前最新的版本很大程度上受到了Hibernate的影响一些读者将EJB 和Hibernate等同起来Oracle支持EJB提议而它是jee领域中重要的数据库公司那么EJB前景就会很好从JEE这个名字本身就能看出它是一种企业级的技术并且EJB本质上就是针对这些企业级的应用由于存在提供的内置容器服务只有Hibernate和EJB联合使用Hibernate才能凸显其重要性因此Hibernate转向到EJB是不可避免的
EJB有三种类型的Bean一种类型是会话Bean存在于企业容器中可以被认为是一种功能Bean以RMIIIOP方式调用
ORM工具有时和会话Bean一起使用最近主要的问题是过去ORM工具具有所有权的价格昂贵的问题但是现在可靠开源的ORM工具可以得到并且Richard Monson Haefel承认使用ORM工具替代实体bean是一种非常安全并且很有开发效率的方法
另外一个类型实体Bean就没有这么走运了EJB EJB 和随后的EJB 在关于实体Bean规范方面做了许多的改变
我们能够说实体bean是一个Attribute bean或者propertybean带有setter 和getter方法以RMIIIOP方式调用存在于企业容器中定义一个Javabean的方式是Java中经常提到的话题同样的方式也要出现在BDKEJBEntity beansStrutsJSF 和现在的Hibernate技术中所以如何定义Javabean是非常重要并且很有艺术性的
第三中类型就是通信和MDB从企业这两个字就看出这里面应用程序里面涉及了很多的用户和并发事务RPC形式非常像打电话容易导致占线问题如果你所呼叫的人正在给别人的打电话那么这个时候就导致了线路阻塞但是通信的样式中如在email中至少要保证信息发送出去很明显RPC是不合适的被夸大了有时我需要即时响应由于一些原因即使像XML web服务如果问题很严重的话也应该采用同新样式MDB(消息驱动bean)事实上越来越被接受
因此为什么单单实体bean发现不合格并且规范老在变呢?
实体bean有两种类型CMP和BMP两种
CMP指的是容器管理持久化而BMP指的是Bean管理持久化理论上说EJB规范并没有规定你采用何种方法来持久化你的对象你也可以简单的将对象串行化数据库可以是对象数据库或者是关系对象数据库或者是XML的但是在实际中数据库经常是指关系数据库使用SQL
在CMP中编码员只是在存储器中处理对象创建新对象修改它们删除它们和查询它们所有都是在存储器中进行的保存这些对象到关系数据库表格中去的任务由容器自动完成编码员不需要些任何的与SQL相关的代码
在BMP中编码员不得不写SQL语句来持久化对象到关系数据库中
EJB 版本的CMP适合简单的表格和其它的表格没有复杂的关系CMP避免对底层数据库的引用因此它是很具有可移植的CMP除了能将数据库持久化到关系数据库中之外还能持久化到对象数据库中去
但是CMP并不是适合所有的情况如果数据库是先前遗留的类型的话如不能使用SQL数据库公司提供了自己的代码来持久化并且这些代码在我们的编程中用来持久化数据这样的情况就不适合了
但是真正的问题在于CMP使用了ORM概念虽然很多的实现迫切需要它并没有暴露EJB开发商到底实现了多少规范Weblogic Oracle IBM WebSphere SUN JBoss都是实现了CMP中他们认为适合的部分使用CMP是不错的并不仅仅因为它使得代码可移植很容易写如果我们采用CMP更多的原因是EJB容器能够极大优化性能因此开发社区希望采用CMP但是发现CMP不适合复杂的任务
虽然做了一些改进但是发现CMP不能成为最终的解决方案它里面没有继承性
虽然EJB容器所提供的服务在真正大的企业级的应用程序中是不可或缺的但是JEE阵营仍让垂直的划分为两个层Web层和EJB层支持Web层的声称EJB的陡峭的学习曲线和容易发生错误的开发环境对于大多数的应用程序是不需要的他们喜欢有一个对象关系映射工具构建到JEE规范中并不是只有在EJB存在ORM任务甚至在ServletsJSP也在使用他们只不过JEE规范没有对此做规定ORM工具如OJB JDO 和 Hibernate不只是能够用在EJB容器还可以用在web容器和一个独立的容器中使用这样的工具JEE标准就会使得开发任务简单无论是开发web层的应用程序还是ejb层的应用程序
在严厉的攻击EJB实体Bean的复杂性和性能时Rod Johnson预言在今后几年JEE将会终止EJB的使用无论我们同不同意他的观点我们还是很有价值去看看他对EJB实体Bean的一些批判他提议将Spring框架作为EJB容器的替代品并且这个观念影响力正在扩大