关于EJB的持久化对象技术分析
2008-01-05 09:32:00 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁绘劦鍓欓崝銈囩磽瀹ュ拑韬€殿喖顭烽幃銏ゅ礂鐏忔牗瀚介梺璇查叄濞佳勭珶婵犲伣锝夘敊閸撗咃紲闂佺粯鍔﹂崜娆撳礉閵堝洨纾界€广儱鎷戦煬顒傗偓娈垮枛椤兘骞冮姀銈呯閻忓繑鐗楃€氫粙姊虹拠鏌ュ弰婵炰匠鍕彾濠电姴浼i敐澶樻晩闁告挆鍜冪床闂備浇顕栭崹搴ㄥ礃閿濆棗鐦遍梻鍌欒兌椤㈠﹤鈻嶉弴銏犵闁搞儺鍓欓悘鎶芥煛閸愩劎澧曠紒鈧崘鈹夸簻闊洤娴烽ˇ锕€霉濠婂牏鐣洪柡灞诲妼閳规垿宕卞▎蹇撴瘓缂傚倷闄嶉崝搴e垝椤栫偛桅闁告洦鍨扮粻鎶芥倵閿濆簼绨藉ù鐘荤畺濮婃椽妫冨☉娆愭倷闁诲孩鐭崡鎶芥偘椤曗偓瀹曞爼顢楁径瀣珫婵犳鍣徊鍓р偓绗涘洤绠查柛銉墮閽冪喖鏌i弬鎸庢喐闁荤喎缍婇弻娑⑩€﹂幋婵囩亪濡炪値鍓欓悧鍡涒€旈崘顔嘉ч幖绮光偓鑼嚬缂傚倷绶¢崰妤呭箰閹间焦鍋╅柣鎴f绾偓闂佺粯鍔曠粔闈浳涢崘顔兼槬闁逞屽墯閵囧嫰骞掗幋婵愪紑閻庤鎸风粈渚€鍩為幋锔藉亹闁圭粯甯╂导鈧紓浣瑰劤瑜扮偟鍒掑▎鎾宠摕婵炴垶鐭▽顏堟煙鐟欏嫬濮囨い銉︾箞濮婃椽鏌呴悙鑼跺濠⒀傚嵆閺岀喖鎼归锝呯3闂佹寧绻勯崑娑㈠煘閹寸姭鍋撻敐搴樺亾椤撴稒娅婇柡灞界У濞碱亪骞忕仦钘夊腐闂備焦鐪归崐鏇㈠箠閹邦喗顫曢柟鎯х摠婵挳鏌涢幘鏉戠祷闁告挸宕—鍐Χ閸℃浠搁梺鑽ゅ暱閺呮盯鎮鹃悜钘壩ㄧ憸澶愬磻閹剧粯鏅查幖绮瑰墲閻忓秹姊虹紒妯诲鞍婵炲弶锕㈡俊鐢稿礋椤栨氨鐤€闂傚倸鐗婄粙鎰姳閼测晝纾藉ù锝堟閻撴劖鎱ㄥΟ绋垮婵″弶鍔欓獮妯兼嫚閼碱剦妲伴梻浣稿暱閹碱偊宕愭繝姣稿洭寮舵惔鎾存杸濡炪倖姊婚妴瀣啅閵夛负浜滄い鎾跺仜濡插鏌i敐鍥у幋妤犵偞甯¢獮瀣籍閳ь剟鎮楁繝姘拺閻熸瑥瀚崕妤呮煕濡 鍋撻悢鎻掑緧婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柛娑橈攻閸欏繑銇勯幘鍗炵仼缁炬儳顭烽弻鐔煎礈瑜忕敮娑㈡煃闁垮鐏﹂柕鍥у楠炴帡宕卞鎯ь棜缂傚倸鍊风粈渚€藝闁秴鏋佸┑鐘虫皑瀹撲線鏌涢埄鍐姇闁稿﹦鍏橀弻娑樷攽閸℃浼€濡炪倖姊归崝鏇㈠煘閹达附鍊婚柛銉㈡櫇鏍¢梻浣告啞閹稿鎮烽敂鐣屸攳濠电姴娲﹂崵鍐煃閸濆嫬鏆熼柨娑欑矒濮婇缚銇愰幒鎴滃枈闂佸憡鐟ユ鎼佸煝閹炬枼鍫柛顐ゅ枔閸樻悂鏌h箛鏇炰户缁绢厼鐖煎畷鎴﹀箻鐠囪尙鐤€婵炶揪绲介幉锟犲磹椤栫偞鈷戠痪顓炴噹娴滃綊鎮跺☉鏍у姦闁糕斁鍋撳銈嗗笒閸燁偊鎯冨ú顏呯厸濞达絽婀辨晶顏堟煃鐟欏嫬鐏撮柟顔界懇瀵爼骞嬮悩杈敇闂傚倷绀佸﹢杈ㄧ仚闂佺濮ょ划搴ㄥ礆閹烘绫嶉柛顐ゅ枎娴犺櫣绱撴担鍓插創妞ゆ洘濞婇弫鍐磼濞戞艾骞堥梻浣告惈濞层垽宕濆畝鍕€堕柣妯肩帛閻撴洟鏌熼懜顒€濡煎ù婊勫劤閳规垿鏁嶉崟顐℃澀闂佺ǹ锕ラ悧鐘茬暦濠靛鏅濋柍褜鍓熼垾锕傚锤濡も偓閻掑灚銇勯幒宥堝厡缂佺姴澧介埀顒€鍘滈崑鎾斥攽閻樿京绐旈柛瀣殔閳规垿顢欑涵鐑界反濠电偛鎷戠徊鍨i幇鏉跨闁瑰啿纾崰鎾诲箯閻樼粯鍤戦柤绋跨仛濮f劙姊婚崒姘偓鐑芥嚄閼哥數浠氭繝鐢靛仜椤曨參宕楀Ο渚殨妞ゆ劑鍊栫€氭氨鈧懓澹婇崰鏍р枔閵婏妇绡€闁汇垽娼ф牎缂佺偓婢樼粔鐟邦嚕閺屻儱绠甸柟鐑樼箘閸炵敻鏌i悩鐑橆仩閻忓繈鍔岄蹇涘Ψ瑜夐崑鎾舵喆閸曨剙纰嶅┑鈽嗗亝缁诲倿锝炶箛娑欐優闁革富鍘鹃敍婊冣攽閳藉棗鐏犻柟纰卞亰閿濈偛顓奸崶鈺冿紳婵炶揪缍侀ˉ鎾诲礉瀹ュ鐓欑紒瀣仢閺嗛亶鏌i敐鍥у幋妤犵偛顑夐弫鍐焵椤掑倻涓嶅┑鐘崇閸嬶綁鏌涢妷鎴濆暟妤犲洭鎮楃憴鍕碍缂佸鎸抽垾鏃堝礃椤斿槈褔鏌涢埄鍏狀亪妫勫鍥╃=濞达絽澹婇崕鎰版煕閵娿儱顣崇紒顔碱儏椤撳吋寰勭€n亖鍋撻柨瀣ㄤ簻闁瑰搫绉堕ˇ锔锯偓娈垮枛閻忔繈鍩為幋锕€鐓¢柛鈩冾殘娴狀垶姊洪崨濠庣劶闁告洦鍙庡ú鍛婁繆閵堝繒鍒伴柛鐕佸灦瀹曟劙宕归锝呭伎濠碘槅鍨抽崢褎绂嶆ィ鍐╁€垫慨妯煎亾鐎氾拷

表格型的关系型数据库与树型java对象之间的映射问题是一个至今争论不休的问题,好在现在已经有了一些好的解决方案。在本文中,我们将介绍EJB技术是怎样用自已特定的方式来解决这个问题的。
只要是涉及到保存及查询信息 ,那绝大多数应用程序都需要与关系数据库打交道。但由于关系数据库与Java对象在结构上有着本质的区别,关于它们之间的映射关系对于那些Java开发者们来说,是一个很令人头痛的问题。关系型数据库是以表格方式存储数据的,而Java对象是以树型方式表现的。这种类型上的不匹配引发了各种各样的对象持久化解决方案,用来缩小关系世界与对象世界之间的鸿沟。EJB框架正是这种解决方案之一。
对象的持久性
目前有很多不同的工具出现,使得开发人员可以将JAVA对象转化为数据库中的字段或记录,或者将数据库中的字段或记录还原为JAVA对象。这些处理涉及到要将树型的JAVA对象序列化到数据库中,反之亦然。此工作的核心是怎样在保证最小性能损失的前提下,来完成这项工作。
EJB框架提供了这样一个对象持久化机制。我们将在本文中讨论这种机制,但首先我们还是对EJB构架作一个全面的熟悉。
企业级JavaBeans(EJB)
EJB技术可以这样定义:它是一个基于JAVA服务端的,为分布式应用提供的一个可复用的组件框架。所有的商业逻辑、部署定义、对象持久性都由这个框架统一治理,EJB框架的一些特色如下:
· EJB是一种运行在服务端环境下的JAVA对象。
· EJB能分布在不同的机器上进行远程访问,但对客户端来而言,调用EJB与调用本地JavaBean一样方便。
· EJB容器对EJB进行统一治理。
尽管企业级JavaBean的名字与普通JavaBean在命名上有些相像,但它们在设计上有着本质上的区别。为了能让你更清楚地熟悉到这点,我们最好先了解一下EJB的基本概念、几种EJB组件模式和其配置环境。
EJB的运行环境
从本质上来说,EJB只是实现了特定接口的普通JAVA对象,但这个对象必须运行在一个特定的环境:EJB容器中。假如脱离了EJB容器,EJB是无法运行的。EJB与EJB容器之间的关系有时候被称为"反向调用"――或者叫"好莱坞原理"(别联系我,到时候我会给你打电话的)。
EJB容器是一种用来治理EJB的运行时环境。它容纳并治理不同类型的EJB,这与JAVA servlet容器治理servlet有些类似。EJB容器负责初始化EJB,并给其提供系统级的服务。
当客户端程序要调用某一个EJB时并不直接与EJB打交道,客户端与EJB被容器隔离起来。
EJB容器提供的服务
当开发者创建一系列的类与接口,用来组成一个EJB时,容器会为他们提供如下的系统级服务:
· 事务处理
· 安全治理
· EJB的持久化治理
· EJB的远程访问
· EJB的生命周期治理
· 数据库连接池
· EJB的实例池治理
由于EJB容器负责为EJB提供这种底层服务,使得一个EJB开发者只需关注具体应用的商业逻辑,从而减少了很多不必要的麻烦。
EJB的类型
EJB规范定义了以下三种不同类型的EJB类型:
· 消息驱动EJB(MDB)
· 会话EJB
· 实体EJB
当客户端与会话EJB或实体EJB交互时,它们的通信方式是同步通信。而消息驱动EJB(MDB)则只与JMS进行交互,它相当于JMS中的一个发布/订阅主题。
消息驱动EJB
消息驱动EJB工作在异步通信模式下。一个消息驱动EJB充当一个消息侦听者的角色,它侦服从JMS的发布/订阅主题中传来的消息。
EJB容器治理着消息驱动EJB的生命周期,然而与会话EJB和实体EJB不同之处在于客户端并不能直接调用它的方法。消息驱动EJB是通过一个名为onMessage的回调函数来接收客户端的消息的。
会话EJB
会话EJB的特点是不能同时被多个客户端共享。当客户端调用会话EJB的方法时,先经过EJB容器处理,然后再由容器对会话EJB进行调用。会话EJB处理开发者编写商业逻辑,容器再将处理结果返回给客户端。会话EJB不能在多个会话中持久保存。它分为两种类型:有状态的会话EJB和无状态的会话EJB。
有状态的会话EJB
当一个客户端与某一个有状态的会话EJB开启一个会话时,这个EJB为客户端维护了一个会话状态。这暗示着客户端向此EJB发出不同的调用请求之间保证EJB的成员变量值不会丢失。
一旦客户端结束与有状态的会话EJB的交互后,EJB容器会自动销毁它。于是整个会话结束,并且此有状态的会话EJB所保存的状态数据会全部丢失。
无状态会话EJB
无状态会话EJB并不为客户端保存任何状态数据。你可以这样认为:客户端每次对无状态会话EJB的调用都会产生一个新的EJB实例,因此所有的状态信息都不会保存。 同样,EJB容器也不会持久化任何无状态会话EJB,因此开发者必须意识到客户端与无状态会话EJB之间进行交互时,所有的状态数据都是临时的。无状态会话EJB的这种特性使得容器可以重复地使用它的实例,因此无状态会话EJB能得到比有状态会话EJB更好的性能。
实体EJB
实体EJB表达的的是一种持久存储的商业逻辑,通常存储于关系型数据库中。实体EJB与关系型数据库有如下的相似之处:
· 实体EJB是持久的――它可以在应用程序的生命周期之外存在,甚至可以在EJB容器的生命周期以外存在。
· 实体EJB答应共享访问――多个客户端可以共享同一个实体EJB,而容器负责治理它们之间的同步。
· 实体EJB有主键――主键用来确定实体EJB的一个唯一实例,利用它可以找到一个特定的持久化实体。
· 实体EJB有事务的概念――由于客户端能并发访问并修改它的数据,因此事务治理是非常重要的。事务治理属性被显示地定义在部署描述文件中,而容器负责治理事务的边界。
要实现对象-关系映射,那实体EJB必须能提供插入、更新、查询、删除的操作。而用于治理实体EJB对象与数据源之间的映射的过程被称为持久化。换句话说,持久化是一个将信息写入外部数据源的一个过程。EJB规范定义了实体EJB的两种持久化方式:Bean自身治理的持久化(BMP)和容器治理的持久化(CMP)。
更多精彩
赞助商链接