簡(jiǎn)化持久化容器管理 CMP實(shí)體bean將成為EJB3.0使得開發(fā)人員強(qiáng)制使用的一個(gè)主要的檢查方式。持久化框架象如OracleAS TopLink, 開源的Hibernate已經(jīng)成為不像實(shí)體bean本質(zhì)上的復(fù)雜和重量級(jí)的開發(fā)J2EE持久化框架應(yīng)用的被大家喜愛的方式。 EJB3.0采納了如TopLink和Hibernate輕量級(jí)的持久化模式來(lái)簡(jiǎn)化容器持久化管理,這些聽起來(lái)更讓開發(fā)人員們欣喜。讓我們簡(jiǎn)單的瀏覽一下實(shí)體bean的計(jì)劃,我們將在另外的文章中討論持久化改進(jìn)的細(xì)節(jié)。 實(shí)體bean作為POJOs已經(jīng)改頭換面,實(shí)體bean將不在需要組件接口。實(shí)體bean現(xiàn)在看起來(lái)是支持繼承和多態(tài)的純粹的對(duì)象。 下面的是關(guān)于實(shí)體bean源代碼 @Entity public class Employee{ ? private Long empNo; ? private String empName; ? private Address address; ? private Hashmap projects = new Hashmap(); ? private Double salary; ? @Id(generate=SEQUENCE) public Long getEmpNo() { ? return empNo; ? } ? protected void setEmpNo(Long empNo) { ? this.empNo = empNo; ? } ? public String getEmpName() { ? return EmpName; ? } ? public void setEmpName(String EmpName){ ? this.EmpName = EmpName; ? } ? @Dependent public Address getAddress() { ? return address; ? } ? public void setAddress(Address address) { ? this.address = address; ? } ? public Set getProjects() { ? return projects; ? } ? public void setProjects(Set projects) { ? this.projects = projects; ? } ? public Double getSalary() { ? return salary; ? } ? public void setSalary(Double salary) { ? this.salary = salary; ? } ? .... ? } 如果你仔細(xì)看這些代碼,你可以發(fā)現(xiàn)在現(xiàn)在的實(shí)體bean中bean類是一個(gè)具體的類而不再是一個(gè)抽象類。 EJB QL和實(shí)體bean的SQL查詢做了多項(xiàng)改進(jìn)。類似于Hibernate的新的實(shí)體管理API和簡(jiǎn)化版的TopLink的會(huì)話API被建議用來(lái)處理實(shí)體bean的操作,也就是實(shí)體bean的創(chuàng)建,釋放,查找。 我們將在深入的文章中進(jìn)一步對(duì)建議CMP實(shí)體bean的細(xì)節(jié)做更多的驗(yàn)證。 簡(jiǎn)化EJB客戶端 即使應(yīng)用中EJB是序列化的,使用EJB也就是尋找和調(diào)用也是非常復(fù)雜的。J2EE 1.4 和 EJB 3.0規(guī)范致力于簡(jiǎn)化EJB客戶端。 如果目前你希望使用EJB你必須在部署描述中定義EJB引用或者EJB本地引用,尋找到EJB然后調(diào)用。如果我們希望調(diào)用HelloWorld 的EJB,你可以按照下面的簡(jiǎn)單方法調(diào)用EJB使用已存在的實(shí)現(xiàn)。 如下在部署描述中找到EJB指示的定義 <ejb-ref> ? <ejb-ref-name>HelloWorldEJB</ejb-ref-name> ? <ejb-ref-type>Session</ejb-ref-type> ? <home>hello.HelloWorldHome</home> ? <remote> hello.HelloWorld</remote> ? </ejb-ref> 然后按照如下方法尋找EJB.你需要明確處理EJB查找和建立一個(gè)bean實(shí)例時(shí)的異常。 try ? { ??? Context context = new InitialContext(); ?????????????? HelloWorldHome helloHome = ?????????????? ? (HelloWorld)PortableRemoteObject.narrow(context.lookup ???? ("java:comp/env/ejb/HelloWorldEJB"), HelloWorldHome.class); ?????????????? HelloWorld hello = helloHome.create(); ?????????????? ? .... ?? } ??? catch(RemoteException e) ?????????????? { ?????????????? ? System.err.println("System/communication error: " + e.getMessage()); ?????????????? } ?????????????? catch(NamingException e) ?????????????? { ?????????????? ? System.err.println("Communication error: " + e.getMessage()); ?????????????? } ?????????????? catch(CreateException e) ?????????????? { ?????????????? ? System.err.println("Error creating EJB instance: " + e.getMessage()); ?????????????? } 如一個(gè)環(huán)境變量的變化一樣,EJB3.0建議使用安放injection的方法查找和調(diào)用EJB. 下面我們使用安放injection的方法在另一個(gè)EJB查找HelloWorldEJB。 @Inject private void setSessionContext(SessionContext ctx) ? { ? this.ctx = ctx ? } ? ... ? myHello = (HelloWorld)ctx.lookup("java:comp/env/ejb/HelloWorldEJB"); 如果你仔細(xì)查看上面的代碼,它依賴的injection使用@Injectset來(lái)的指定對(duì)SessionContext方法的annotations。injection 方法將可以在業(yè)務(wù)方法被EJB調(diào)用前被容器調(diào)用來(lái)設(shè)定EJBContext。 另一個(gè)injected 的HelloWorld會(huì)話bean的直接的范例可以簡(jiǎn)化為使用 @EJB public HelloWorld myHello,這將使得myHello被HelloWorld bean的實(shí)例injected 。 你可以使用依賴的injection來(lái)查詢?nèi)魏晤愋偷沫h(huán)境和資源參考如DataSource, JMS, Mail, Web Service等等。 容器外部測(cè)試可行性 一個(gè)現(xiàn)在EJB開發(fā)者所關(guān)注的不僅僅是EJB開發(fā)的復(fù)雜,也包括了測(cè)試的可怕之處。開發(fā)和測(cè)試EJB必須需要一個(gè)EJB容器并且開發(fā)人員必須熟悉最終部署平臺(tái)才可以執(zhí)行測(cè)試。這對(duì)于許多只在一個(gè)主要平臺(tái)開發(fā)的企業(yè)開發(fā)人員來(lái)說(shuō)不是主要問(wèn)題,但是對(duì)于支持多個(gè)開發(fā)商平臺(tái)并且要在維護(hù)的多個(gè)環(huán)境中測(cè)試EJB的ISV們來(lái)說(shuō)是個(gè)大問(wèn)題。EJB3.0規(guī)范承諾將提供在容器外測(cè)試的功能,但是這點(diǎn)在這次的規(guī)范中遺漏掉了。 結(jié)論 雖然還有很多關(guān)于打包,裝配和重要的API細(xì)節(jié)沒(méi)有在這個(gè)規(guī)范中提及,但是諸多的建議使得EJB3.0規(guī)范讓企業(yè)級(jí)Java開發(fā)人員看起來(lái)是恨有前途的。通過(guò)這些無(wú)疑是從開發(fā)人員到服務(wù)供應(yīng)商都將幫助減少開發(fā)的復(fù)雜性。下面就要看服務(wù)提供商們?cè)趺磳?shí)現(xiàn),并使得EJB3.0成為企業(yè)級(jí)應(yīng)用一個(gè)引人矚目的選擇。 Author Bio 作者自述 Debu Panda是Oracle應(yīng)用服務(wù)開發(fā)小組的主要管理者,他的在EJB容器和事務(wù)管理上取得過(guò)很多成就。他已經(jīng)有13年的IT產(chǎn)業(yè)的經(jīng)驗(yàn)并在多家雜志和技術(shù)出版社刊登過(guò)很多著作。 ? 翻譯問(wèn)題: 由于部分英文名詞未敢枉自翻譯,所以留英文原詞在文中 Cleaning up the Dirty Laundry?????? 整理缺陷 low carb Atkins diet metadata annotations???? ?????????????? 元數(shù)據(jù)描述 Simplifying Client View for EJBs?? 簡(jiǎn)化EJB客戶端 dependency injection???????? ?????????? 依賴型injection setter injection????????????? ?????????????? 安放injection ISV Independent software vendor 獨(dú)立軟件供應(yīng)商 |