簡化持久化容器管理 CMP實體bean將成為EJB3.0使得開發人員強制使用的一個主要的檢查方式。持久化框架象如OracleAS TopLink, 開源的Hibernate已經成為不像實體bean本質上的復雜和重量級的開發J2EE持久化框架應用的被大家喜愛的方式。 EJB3.0采納了如TopLink和Hibernate輕量級的持久化模式來簡化容器持久化管理,這些聽起來更讓開發人員們欣喜。讓我們簡單的瀏覽一下實體bean的計劃,我們將在另外的文章中討論持久化改進的細節。 實體bean作為POJOs已經改頭換面,實體bean將不在需要組件接口。實體bean現在看起來是支持繼承和多態的純粹的對象。 下面的是關于實體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; ? } ? .... ? } 如果你仔細看這些代碼,你可以發現在現在的實體bean中bean類是一個具體的類而不再是一個抽象類。 EJB QL和實體bean的SQL查詢做了多項改進。類似于Hibernate的新的實體管理API和簡化版的TopLink的會話API被建議用來處理實體bean的操作,也就是實體bean的創建,釋放,查找。 我們將在深入的文章中進一步對建議CMP實體bean的細節做更多的驗證。 簡化EJB客戶端 即使應用中EJB是序列化的,使用EJB也就是尋找和調用也是非常復雜的。J2EE 1.4 和 EJB 3.0規范致力于簡化EJB客戶端。 如果目前你希望使用EJB你必須在部署描述中定義EJB引用或者EJB本地引用,尋找到EJB然后調用。如果我們希望調用HelloWorld 的EJB,你可以按照下面的簡單方法調用EJB使用已存在的實現。 如下在部署描述中找到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查找和建立一個bean實例時的異常。 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()); ?????????????? } 如一個環境變量的變化一樣,EJB3.0建議使用安放injection的方法查找和調用EJB. 下面我們使用安放injection的方法在另一個EJB查找HelloWorldEJB。 @Inject private void setSessionContext(SessionContext ctx) ? { ? this.ctx = ctx ? } ? ... ? myHello = (HelloWorld)ctx.lookup("java:comp/env/ejb/HelloWorldEJB"); 如果你仔細查看上面的代碼,它依賴的injection使用@Injectset來的指定對SessionContext方法的annotations。injection 方法將可以在業務方法被EJB調用前被容器調用來設定EJBContext。 另一個injected 的HelloWorld會話bean的直接的范例可以簡化為使用 @EJB public HelloWorld myHello,這將使得myHello被HelloWorld bean的實例injected 。 你可以使用依賴的injection來查詢任何類型的環境和資源參考如DataSource, JMS, Mail, Web Service等等。 容器外部測試可行性 一個現在EJB開發者所關注的不僅僅是EJB開發的復雜,也包括了測試的可怕之處。開發和測試EJB必須需要一個EJB容器并且開發人員必須熟悉最終部署平臺才可以執行測試。這對于許多只在一個主要平臺開發的企業開發人員來說不是主要問題,但是對于支持多個開發商平臺并且要在維護的多個環境中測試EJB的ISV們來說是個大問題。EJB3.0規范承諾將提供在容器外測試的功能,但是這點在這次的規范中遺漏掉了。 結論 雖然還有很多關于打包,裝配和重要的API細節沒有在這個規范中提及,但是諸多的建議使得EJB3.0規范讓企業級Java開發人員看起來是恨有前途的。通過這些無疑是從開發人員到服務供應商都將幫助減少開發的復雜性。下面就要看服務提供商們怎么實現,并使得EJB3.0成為企業級應用一個引人矚目的選擇。 Author Bio 作者自述 Debu Panda是Oracle應用服務開發小組的主要管理者,他的在EJB容器和事務管理上取得過很多成就。他已經有13年的IT產業的經驗并在多家雜志和技術出版社刊登過很多著作。 ? 翻譯問題: 由于部分英文名詞未敢枉自翻譯,所以留英文原詞在文中 Cleaning up the Dirty Laundry?????? 整理缺陷 low carb Atkins diet metadata annotations???? ?????????????? 元數據描述 Simplifying Client View for EJBs?? 簡化EJB客戶端 dependency injection???????? ?????????? 依賴型injection setter injection????????????? ?????????????? 安放injection ISV Independent software vendor 獨立軟件供應商 |