﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Jeff's Java Home-随笔分类-JPA and Hibernate</title><link>http://www.blogjava.net/liucunjie/category/27669.html</link><description>Jeff's Java Home</description><language>zh-cn</language><lastBuildDate>Fri, 30 Nov 2007 09:53:10 GMT</lastBuildDate><pubDate>Fri, 30 Nov 2007 09:53:10 GMT</pubDate><ttl>60</ttl><item><title>JPA会是ORM的王道吗？（转）</title><link>http://www.blogjava.net/liucunjie/archive/2007/11/30/164176.html</link><dc:creator>Jeff's Java Home</dc:creator><author>Jeff's Java Home</author><pubDate>Fri, 30 Nov 2007 01:47:00 GMT</pubDate><guid>http://www.blogjava.net/liucunjie/archive/2007/11/30/164176.html</guid><wfw:comment>http://www.blogjava.net/liucunjie/comments/164176.html</wfw:comment><comments>http://www.blogjava.net/liucunjie/archive/2007/11/30/164176.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liucunjie/comments/commentRss/164176.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liucunjie/services/trackbacks/164176.html</trackback:ping><description><![CDATA[<div class="postcontent">
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">近几年持久化技术领域异常喧嚣，各种框架雨后春笋般地冒出。例如</span>Spring<span style="font-family: 宋体">对多个持久化技术提供了集成的支持，还通过</span>Spring JDBC<span style="font-family: 宋体">框架对</span>JDBC API<span style="font-family: 宋体">进行简化。</span>Sun<span style="font-family: 宋体">也连接不断地颁布几个持久化规范，如</span>JPA(Java Persistence API)<span style="font-family: 宋体">。</span>JPA<span style="font-family: 宋体">作为</span>Java EE 5.0<span style="font-family: 宋体">平台标准的</span>ORM<span style="font-family: 宋体">规范，将得到所有</span>Java EE<span style="font-family: 宋体">服务器的支持。</span>Sun<span style="font-family: 宋体">这次吸取了之前</span>EJB<span style="font-family: 宋体">规范惨痛失败的经历，在充分吸收现有</span>ORM<span style="font-family: 宋体">框架的基础上，得到了一个易于使用、伸缩性强的</span>ORM<span style="font-family: 宋体">规范。从目前的开发社区的反应上看，</span>JPA<span style="font-family: 宋体">受到了极大的支持和赞扬，</span>JPA<span style="font-family: 宋体">作为</span>ORM<span style="font-family: 宋体">领域标准化整合者的目标应该不难实现。</span></span></span></p>
<p style="margin-left: 42pt; text-indent: -21pt; tab-stops: list 42.0pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><strong><span style="font-size: 14pt">一、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="font-size: 14pt; font-family: 宋体">引子</span></strong></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">荀子在《荀子</span>&#183;<span style="font-family: 宋体">王制》中有云：王夺之人，霸夺之与，强夺之地。什么叫王道？就是仁义，以德待人，把人感动得甘心情愿认你当老大。什么叫霸道？就是你有实力，以力服人，谁不服就把他打服为止。从哲学上说，王道是正道，当然正道须以实力为基础。王道中也包含霸道，但王道顺势而行。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">最近，笔者查看了</span>JPA<span style="font-family: 宋体">（</span>java <span style="font-family: 宋体">持久性</span>API)<span style="font-family: 宋体">的相关规范，作为</span>EJB3.0<span style="font-family: 宋体">的重要组成部分，</span>JPA<span style="font-family: 宋体">还是很值得关注的。看完规范，感觉</span>JPA<span style="font-family: 宋体">还是比较的单一，其目标就是实现</span>Java <span style="font-family: 宋体">持久性的通用。</span>JPA<span style="font-family: 宋体">采用纯</span>POJO<span style="font-family: 宋体">的方式实现，更多的是采用</span>Java 5<span style="font-family: 宋体">注释（</span>Annotation<span style="font-family: 宋体">），它利用</span> Java 5 <span style="font-family: 宋体">中的注释和对象</span>/<span style="font-family: 宋体">关系映射，为数据持久化提供了更简单、易用的编程方式。</span>JPA<span style="font-family: 宋体">的优势是多供应商的支持，可以运行在容器之中，也可以运行于容器之外，这就是其显著的优点。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">Java&#8482; Platform<span style="font-family: 宋体">，</span> Enterprise Edition (Java EE 5)<span style="font-family: 宋体">的设计方法，充分利用了</span> Enterprise JavaBeans&#8482; (EJB) 3.0 <span style="font-family: 宋体">新的</span> Java Persistence API (JPA)<span style="font-family: 宋体">特性。</span>JPA <span style="font-family: 宋体">提供了一种标准的对象关系映射解决方案，该解决方案避免了依赖第三方框架（如</span> Hibernate<span style="font-family: 宋体">）。</span>Java EE 5 <span style="font-family: 宋体">许多新功能都包含在经过修补的</span> EJB <span style="font-family: 宋体">架构中，其突出特性之一是</span> JPA<span style="font-family: 宋体">。由于具有容器内和容器外持久性选项，</span>JPA <span style="font-family: 宋体">为</span> J2EE <span style="font-family: 宋体">软件架构师带来一系列全新设计选择。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">JPA<span style="font-family: 宋体">受到了极大的支持和赞扬，那到</span>JPA<span style="font-family: 宋体">作为</span>ORM<span style="font-family: 宋体">领域标准化整合者的目标应该能实现吗？能成来</span>ORM<span style="font-family: 宋体">的王道吗？</span></span></span></p>
<p style="margin-left: 42pt; text-indent: -21pt; tab-stops: list 42.0pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><strong><span style="font-size: 14pt">二、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="font-size: 14pt">JPA</span></strong><strong><span style="font-size: 14pt; font-family: 宋体">来了</span></strong></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">JPA<span style="font-family: 宋体">通过</span>JDK 5.0<span style="font-family: 宋体">注解或</span>XML<span style="font-family: 宋体">描述对象－关系表的映射关系，并将运行期的实体对象持久化到数据库中，图</span> 1<span style="font-family: 宋体">很好地描述了</span>JPA</span></span><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">的结构：<br />
</span></span></span></p>
<p style="text-indent: 21pt; text-align: center" align="center"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体"><img height="383" alt="" src="http://www.blogjava.net/images/blogjava_net/sterning/JPA-P1.jpg" width="566" border="0" /><br />
图</span>1.JPA<span style="font-family: 宋体">的结构图</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">Sun<span style="font-family: 宋体">引入新的</span>JPA ORM<span style="font-family: 宋体">规范出于两个原因：其一，简化现有</span>Java EE<span style="font-family: 宋体">和</span>Java SE<span style="font-family: 宋体">应用的对象持久化的开发工作；其二，</span>Sun<span style="font-family: 宋体">希望整合对</span>ORM<span style="font-family: 宋体">技术，实现天下归一。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">JPA<span style="font-family: 宋体">由</span>EJB 3.0<span style="font-family: 宋体">软件专家组开发，作为</span>JSR-220<span style="font-family: 宋体">实现的一部分。但它不囿于</span>EJB 3.0<span style="font-family: 宋体">，你可以在</span>Web<span style="font-family: 宋体">应用、甚至桌面应用中使用。</span>JPA<span style="font-family: 宋体">的宗旨是为</span>POJO<span style="font-family: 宋体">提供持久化标准规范，由此可见，经过这几年的实践探索，能够脱离容器独立运行，方便开发和测试的理念已经深入人心了。目前</span>Hibernate 3.2<span style="font-family: 宋体">、</span>TopLink 10.1.3<span style="font-family: 宋体">以及</span>OpenJPA<span style="font-family: 宋体">都提供了</span>JPA<span style="font-family: 宋体">的实现。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">JPA<span style="font-family: 宋体">的总体思想和现有</span>Hibernate<span style="font-family: 宋体">、</span>TopLink<span style="font-family: 宋体">，</span>JDO<span style="font-family: 宋体">等</span>ORM<span style="font-family: 宋体">框架大体一致。总的来说，</span>JPA<span style="font-family: 宋体">包括以下</span>3<span style="font-family: 宋体">方面的技术：</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">ORM<span style="font-family: 宋体">映射元数据，</span>JPA<span style="font-family: 宋体">支持</span>XML<span style="font-family: 宋体">和</span>JDK 5.0<span style="font-family: 宋体">注解两种元数据的形式，元数据描述对象和表之间的映射关系，框架据此将实体对象持久化到数据库表中；</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">JPA <span style="font-family: 宋体">的</span>API<span style="font-family: 宋体">，用来操作实体对象，执行</span>CRUD<span style="font-family: 宋体">操作，框架在后台替我们完成所有的事情，开发者从繁琐的</span>JDBC<span style="font-family: 宋体">和</span>SQL<span style="font-family: 宋体">代码中解脱出来。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">查询语言，这是持久化操作中很重要的一个方面，通过面向对象而非面向数据库的查询语言查询数据，避免程序的</span>SQL<span style="font-family: 宋体">语句紧密耦合。</span></span></span></p>
<p style="margin-left: 42pt; text-indent: -21pt; tab-stops: list 42.0pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><strong><span style="font-size: 14pt">三、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="font-size: 14pt">JPA</span></strong><strong><span style="font-size: 14pt; font-family: 宋体">的优势</span></strong></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">1 <span style="font-family: 宋体">标准化</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">JPA <span style="font-family: 宋体">是</span> JCP <span style="font-family: 宋体">组织发布的</span> Java EE <span style="font-family: 宋体">标准之一，因此任何声称符合</span> JPA <span style="font-family: 宋体">标准的框架都遵循同样的架构，提供相同的访问</span> API<span style="font-family: 宋体">，这保证了基于</span>JPA<span style="font-family: 宋体">开发的企业应用能够经过少量的修改就能够在不同的</span>JPA<span style="font-family: 宋体">框架下运行。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">2 <span style="font-family: 宋体">对容器级特性的支持</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">JPA <span style="font-family: 宋体">框架中支持大数据集、事务、并发等容器级事务，这使得</span> JPA <span style="font-family: 宋体">超越了简单持久化框架的局限，在企业应用发挥更大的作用。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">3 <span style="font-family: 宋体">简单易用，集成方便</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">JPA<span style="font-family: 宋体">的主要目标之一就是提供更加简单的编程模型：在</span>JPA<span style="font-family: 宋体">框架下创建实体和创建</span>Java <span style="font-family: 宋体">类一样简单，没有任何的约束和限制，只需要使用</span> javax.persistence.Entity<span style="font-family: 宋体">进行注释；</span>JPA<span style="font-family: 宋体">的框架和接口也都非常简单，没有太多特别的规则和设计模式的要求，开发者可以很容易的掌握。</span>JPA<span style="font-family: 宋体">基于非侵入式原则设计，因此可以很容易的和其它框架或者容器集成。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">4 <span style="font-family: 宋体">可媲美</span>JDBC<span style="font-family: 宋体">的查询能力</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="color: black; font-family: ˎ̥">JPA</span><span style="color: black; font-family: 宋体">的查询语言是</span><span style="font-family: 宋体">面向对象而非面向数据库的，它以面向对象的自然语法构造查询语句，可以看成是</span></span></span><a href="http://www.qqread.com/z/hibernate/index.html" target="_blank"><span style="color: windowtext; text-decoration: none; text-underline: none"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">Hibernate</span></span></a><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"> HQL</span></span></span><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">的等价物。</span>JPA<span style="font-family: 宋体">定义了独特的</span>JPQL<span style="font-family: 宋体">（</span>Java Persistence Query Language<span style="font-family: 宋体">），</span>JPQL<span style="font-family: 宋体">是</span>EJB QL<span style="font-family: 宋体">的一种扩展，它是针对实体的一种查询语言，操作对象是实体，而不是关系数据库的表，而且能够支持批量更新和修改、</span>JOIN<span style="font-family: 宋体">、</span>GROUP BY<span style="font-family: 宋体">、</span>HAVING <span style="font-family: 宋体">等通常只有</span> SQL <span style="font-family: 宋体">才能够提供的高级查询特性，甚至还能够支持子查询。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">5 <span style="font-family: 宋体">支持面向对象的高级特性</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">JPA <span style="font-family: 宋体">中能够支持面向对象的高级特性，如类之间的继承、多态和类之间的复杂关系，这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用，而不需要自行处理这些特性在关系数据库的持久化。</span></span></span></p>
<p style="margin-left: 42pt; text-indent: -21pt; tab-stops: list 42.0pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><strong><span style="font-size: 14pt">四、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="font-size: 14pt">JPA</span></strong><strong><span style="font-size: 14pt; font-family: 宋体">的供应商</span></strong></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">JPA <span style="font-family: 宋体">的目标之一是制定一个可以由很多供应商实现的</span>API<span style="font-family: 宋体">，并且开发人员可以编码来实现该</span>API<span style="font-family: 宋体">，而不是使用私有供应商特有的</span>API<span style="font-family: 宋体">。因此开发人员只需使用供应商特有的</span>API<span style="font-family: 宋体">来获得</span>JPA<span style="font-family: 宋体">规范没有解决但应用程序中需要的功能。尽可能地使用</span>JPA API<span style="font-family: 宋体">，但是当需要供应商公开但是规范中没有提供的功能时，则使用供应商特有的</span>API<span style="font-family: 宋体">。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">1 Hibernate</span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">JPA<span style="font-family: 宋体">是需要</span>Provider<span style="font-family: 宋体">来实现其功能的，</span>Hibernate<span style="font-family: 宋体">就是</span>JPA Provider<span style="font-family: 宋体">中很强的一个，目前来说应该无人能出其右。从功能上来说，</span>JPA<span style="font-family: 宋体">现在就是</span>Hibernate<span style="font-family: 宋体">功能的一个子集。</span>Hibernate <span style="font-family: 宋体">从</span>3.2<span style="font-family: 宋体">开始，就开始兼容</span>JPA<span style="font-family: 宋体">。</span>Hibernate3.2<span style="font-family: 宋体">获得了</span>Sun TCK<span style="font-family: 宋体">的</span>JPA(Java Persistence API) <span style="font-family: 宋体">兼容认证。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">只要熟悉</span>Hibernate<span style="font-family: 宋体">或者其他</span>ORM<span style="font-family: 宋体">框架，在使用</span>JPA<span style="font-family: 宋体">时会发现其实非常容易上手。例如实体对象的状态，在</span>Hibernate<span style="font-family: 宋体">有自由、持久、游离三种，</span>JPA<span style="font-family: 宋体">里有</span>new<span style="font-family: 宋体">，</span>managed<span style="font-family: 宋体">，</span>detached<span style="font-family: 宋体">，</span>removed<span style="font-family: 宋体">，明眼人一看就知道，这些状态都是一一对应的。再如</span>flush<span style="font-family: 宋体">方法，都是对应的，而其他的再如说</span>Query query = manager.createQuery(sql)<span style="font-family: 宋体">，它在</span>Hibernate<span style="font-family: 宋体">里写法上是</span>session<span style="font-family: 宋体">，而在</span>JPA<span style="font-family: 宋体">中变成了</span>manager<span style="font-family: 宋体">，所以从</span>Hibernate<span style="font-family: 宋体">到</span>JPA<span style="font-family: 宋体">的代价应该是非常小的</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">同样，</span>JDO<span style="font-family: 宋体">，也开始兼容</span>JPA<span style="font-family: 宋体">。在</span>ORM<span style="font-family: 宋体">的领域中，看来</span>JPA<span style="font-family: 宋体">已经是王道，规范就是规范。在各大厂商的支持下，</span>JPA<span style="font-family: 宋体">的使用开始变得广泛。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">2 Spring</span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">Spring&nbsp;+&nbsp;Hibernate&nbsp;<span style="font-family: 宋体">常常被称为</span>&nbsp;Java&nbsp;Web&nbsp;<span style="font-family: 宋体">应用人气最旺的框架组合。而在</span>&nbsp;JCP&nbsp;<span style="font-family: 宋体">通过的</span>&nbsp;Web&nbsp;Beans&nbsp;JSR&nbsp;<span style="font-family: 宋体">，却欲将</span>JSF&nbsp;+&nbsp;EJB&nbsp;+&nbsp;JPA&nbsp;<span style="font-family: 宋体">、来自</span>&nbsp;JBoss&nbsp;Seam<span style="font-family: 宋体">（</span>Spring&nbsp;<span style="font-family: 宋体">除外）的一些组件和</span>EJB&nbsp;3<span style="font-family: 宋体">（目前能够提供有基本拦截和依赖注入功能的简化</span>&nbsp;Session&nbsp;Bean&nbsp;<span style="font-family: 宋体">框架）的一个</span>&nbsp;Web&nbsp;<span style="font-family: 宋体">组合进行标准化。如今的</span>&nbsp;Spring&nbsp;2.0&nbsp;<span style="font-family: 宋体">为</span>&nbsp;JPA&nbsp;<span style="font-family: 宋体">提供了完整的</span>&nbsp;EJB&nbsp;<span style="font-family: 宋体">容器契约，允许</span>&nbsp;JPA<span style="font-family: 宋体">在任何环境内可以在</span>&nbsp;Spring&nbsp;<span style="font-family: 宋体">管理的服务层使用（包括</span>&nbsp;Spring&nbsp;<span style="font-family: 宋体">的所有</span>&nbsp;AOP&nbsp;<span style="font-family: 宋体">和</span>&nbsp;DI&nbsp;<span style="font-family: 宋体">增强）。同时，关于下一个</span>Web<span style="font-family: 宋体">应用组合会是</span>&nbsp;EJB<span style="font-family: 宋体">、</span>Spring&nbsp;+&nbsp;Hibernate&nbsp;<span style="font-family: 宋体">还是</span>&nbsp;Spring&nbsp;+&nbsp;JPA&nbsp;<span style="font-family: 宋体">的论战，早已充斥于耳。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">在</span>Spring 2.0.1<span style="font-family: 宋体">中，正式提供对</span>JPA<span style="font-family: 宋体">的支持，这也促成了</span>JPA<span style="font-family: 宋体">的发展，要知道</span>JPA<span style="font-family: 宋体">的好处在于可以分离于容器运行，变得更加的简洁。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">3 OpenJPA</span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">OpenJPA <span style="font-family: 宋体">是</span> Apache <span style="font-family: 宋体">组织提供的开源项目，它实现了</span> EJB 3.0 <span style="font-family: 宋体">中的</span> JPA <span style="font-family: 宋体">标准，为开发者提供功能强大、使用简单的持久化数据管理框架。</span>OpenJPA <span style="font-family: 宋体">封装了和关系型数据库交互的操作，让开发者把注意力集中在编写业务逻辑上。</span>OpenJPA <span style="font-family: 宋体">可以作为独立的持久层框架发挥作用，也可以轻松的与其它</span> Java EE <span style="font-family: 宋体">应用框架或者符合</span> EJB 3.0 <span style="font-family: 宋体">标准的容器集成。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">4 <span style="font-family: 宋体">其它</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">目前支持的实现包括</span>Toplink<span style="font-family: 宋体">、</span>Hibernate Entitymanager<span style="font-family: 宋体">等。</span>TopLink<span style="font-family: 宋体">以前需要收费，如今开源了。</span>OpenJPA<span style="font-family: 宋体">虽然免费，但功能、性能、普及性等方面更加需要加大力度。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">对于</span>EJB<span style="font-family: 宋体">来说，实体</span>Bean<span style="font-family: 宋体">一直是被批评的对象，由于其太复杂和庞大。</span>JPA<span style="font-family: 宋体">的出现，很大程度的分离了复杂性。这让</span>EJB<span style="font-family: 宋体">的推广也变得容易。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">总而言之，</span>JPA<span style="font-family: 宋体">规范主要关注的仅是</span>API<span style="font-family: 宋体">的行为方面，而由各种实现完成大多数性能有关的调优。尽管如此，所有可靠的实现都应该拥有某种数据缓存，以作为选择。但愿不久的将来，</span>JPA<span style="font-family: 宋体">能成为真正的标准。</span></span></span></p>
<p style="margin-left: 42pt; text-indent: -21pt; tab-stops: list 42.0pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><strong><span style="font-size: 14pt">五、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="font-size: 14pt; font-family: 宋体">小结</span></strong></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">EJB 3.0<span style="font-family: 宋体">和</span>JPA <span style="font-family: 宋体">毫无疑问将是</span>Java EE 5<span style="font-family: 宋体">的主要卖点。在某些领域中，它们给</span>Java<span style="font-family: 宋体">社区带来了竞争优势，并使</span>Java <span style="font-family: 宋体">在其他领域与竞争对手不分伯仲（因为，不可否认，目前某些领域尚不存在基于标准的方法）。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">过去数年来，</span>Spring Framework<span style="font-family: 宋体">一直是</span>EJB<span style="font-family: 宋体">在企业领域的主要竞争对手。</span>EJB3.0<span style="font-family: 宋体">规范解决了很多促进</span>Spring<span style="font-family: 宋体">兴起的问题。随着它的出现，</span>EJB3.0<span style="font-family: 宋体">毫无疑问比</span>Spring<span style="font-family: 宋体">提供了更好的开发体验——最引人注目的优势是它不需要配置文件。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">JPA<span style="font-family: 宋体">提供一种标准的</span>OR<span style="font-family: 宋体">映射解决方案，该解决方案完全集成到</span>EJB3<span style="font-family: 宋体">。</span>0<span style="font-family: 宋体">兼容的容器中。</span>JPA<span style="font-family: 宋体">的前辈将会继续稳定发展，但是业务应用程序中的</span> raw <span style="font-family: 宋体">使用将可能会减少。实现</span> JPA <span style="font-family: 宋体">兼容的实体管理器似乎很可能是此类技术的发展方向。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">Java EE<span style="font-family: 宋体">系列规范的较大问题与</span>JPA<span style="font-family: 宋体">没有任何关系。</span>Java EE <span style="font-family: 宋体">系列规范的问题涉及到</span> Web<span style="font-family: 宋体">和</span>EJB<span style="font-family: 宋体">容器之间的集成。</span>Spring<span style="font-family: 宋体">在此领域仍然具有主要竞争优势。</span>JBoss<span style="font-family: 宋体">的</span>Seam<span style="font-family: 宋体">项目尝试使用自定义的方法来解决这一问题。</span>Caucho Resin<span style="font-family: 宋体">应用服务器试图扩展容器边界并支持在</span>Web<span style="font-family: 宋体">容器中使用</span>@EJB<span style="font-family: 宋体">注释。我们希望</span>Java EE 5.1<span style="font-family: 宋体">将解决层集成的问题，为我们提供一个全面而标准的依赖性注入方法。</span></span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">在不久的将来，</span>Sun<span style="font-family: 宋体">可能会将</span>JPA<span style="font-family: 宋体">作为一个单独的</span>JSR<span style="font-family: 宋体">对待，同时</span>JPA<span style="font-family: 宋体">还可能作为</span></span></span><a href="http://www.qqread.com/keys/java/index.html" target="_blank"><span style="color: windowtext; text-decoration: none; text-underline: none"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">Java</span></span></a><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"> SE</span></span></span><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">的一部分。不过这些都不太重要，重要的是，我们现在已经可以在脱离容器的情况下、在</span>Java SE<span style="font-family: 宋体">应用中使用</span>JPA<span style="font-family: 宋体">了。</span>&nbsp;</span></span></p>
<p style="text-indent: 21pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">JPA<span style="font-family: 宋体">已经作为一项对象持久化的标准，不但可以获得</span>Java EE<span style="font-family: 宋体">应用</span></span></span><a href="http://www.qqread.com/network/server/index.html" target="_blank"><span style="color: windowtext; font-family: 宋体; text-decoration: none; text-underline: none"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">服务器</span></span></a></span><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">的支持，还可以直接在</span>Java SE<span style="font-family: 宋体">中使用。开发者将无需在现有多种</span>ORM<span style="font-family: 宋体">框架中艰难地选择，按照</span>Sun<span style="font-family: 宋体">的预想，现有</span>ORM<span style="font-family: 宋体">框架头顶的光环将渐渐暗淡，不再具有以往的吸引力。</span></span></span></p>
</div>
<img src ="http://www.blogjava.net/liucunjie/aggbug/164176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liucunjie/" target="_blank">Jeff's Java Home</a> 2007-11-30 09:47 <a href="http://www.blogjava.net/liucunjie/archive/2007/11/30/164176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>