EJB3實體組件在J2SE中的使用
前言:
越來越多的企業將越來越多的業務轉向自動化或半自動化平臺,他們通過這個過程,進一步優化企業資源與管理方法,另一方面大大提升業務執行的效率與精確性。因此軟件工程所需解決的實際問題,業務越來越復雜,規模越來越大,新舊系統配合使用的需求越來越多。軟件工程技術和其它領域的生產力發展,就這樣相互促進!
對系統進行合理分解,是軟件工程(也是其它領域)降低系統復雜性的常用手段和唯一的基本方法,今天的企業級應用系統一般由如下部份組成:
以上其實是由上到下的 4 個層次,系統復雜度被分解到各層次的各個組件中。系統中間件就是其中對軟件技術進行歸納的一個層次,該層次將一些常用的系統功能,從業務邏輯中剝離出來,并分門別類。本例即涉及系統中間件的使用。
對中間件而言,開發人員只需要熟悉它們的使用方法,然后運用 "拿來主義",直接拿來,合理使用即可,是相當不錯的開發資源。今天 "拿來" 的是 EJB3 持久層規范的 Hibernate 實現版本。交互代碼就是在主程序中對規范中的接口的調用,很簡單的示例。
應該在這里提出"配置文件" 這一設計模式了 ---- 一定有人發笑:配置文件與設計模式何干?在系統維護過程中,當系統需要靈活變更組件或策略時,以配置文件代替硬編碼來處理這種 "替換",大大減免了實現該邏輯的代碼重新經歷 "修改,編譯,測試,發布" 等軟件過程的機率 (配置文件中的內容需合理規劃,否則將導致復雜性上升。 EJB 2.x 的部署描述文件就是最好佐證。 Log4J 配置文件則堪稱典范)。 配置文件在組件裝配方面更是功勛卓著。本文示例包含2個配置文件。
諸多贅述,只是希望能使入門級朋友有個思想準備:為何本文示例并非一段代碼,而由這么多松散的部份組成。下面言歸正傳。
導讀:
本例的操作內容為:1,清除數據庫中各表內容; 2,向數據庫添加用戶 hedan, 角色 friend, 并將新角色賦予新用戶; 3,查詢數據庫中所有用戶及其角色,并將之一一打印。這 3 個步驟分別對應 TestIt 類中的 removeAll, insert, query 三個方法。
下文中步驟 3、4 和 5 的內容是與 EJB3 – Persistence 規范相關的要點所在(請閱讀這些小篇幅的源文件或配置文件中的說明),其它內容相對次要。
本文假設讀者能熟練使用 Eclipse JDT 及 Hibernate Tools, 并熟悉 POSTGRESQL 的基本操作。
越來越多的企業將越來越多的業務轉向自動化或半自動化平臺,他們通過這個過程,進一步優化企業資源與管理方法,另一方面大大提升業務執行的效率與精確性。因此軟件工程所需解決的實際問題,業務越來越復雜,規模越來越大,新舊系統配合使用的需求越來越多。軟件工程技術和其它領域的生產力發展,就這樣相互促進!
對系統進行合理分解,是軟件工程(也是其它領域)降低系統復雜性的常用手段和唯一的基本方法,今天的企業級應用系統一般由如下部份組成:
- 用戶交互模塊,
- 基于行業規范的業務中間件,
- 基于軟件工程技術規范的系統中間件,
- 軟硬件基礎平臺組成。
以上其實是由上到下的 4 個層次,系統復雜度被分解到各層次的各個組件中。系統中間件就是其中對軟件技術進行歸納的一個層次,該層次將一些常用的系統功能,從業務邏輯中剝離出來,并分門別類。本例即涉及系統中間件的使用。
對中間件而言,開發人員只需要熟悉它們的使用方法,然后運用 "拿來主義",直接拿來,合理使用即可,是相當不錯的開發資源。今天 "拿來" 的是 EJB3 持久層規范的 Hibernate 實現版本。交互代碼就是在主程序中對規范中的接口的調用,很簡單的示例。
應該在這里提出"配置文件" 這一設計模式了 ---- 一定有人發笑:配置文件與設計模式何干?在系統維護過程中,當系統需要靈活變更組件或策略時,以配置文件代替硬編碼來處理這種 "替換",大大減免了實現該邏輯的代碼重新經歷 "修改,編譯,測試,發布" 等軟件過程的機率 (配置文件中的內容需合理規劃,否則將導致復雜性上升。 EJB 2.x 的部署描述文件就是最好佐證。 Log4J 配置文件則堪稱典范)。 配置文件在組件裝配方面更是功勛卓著。本文示例包含2個配置文件。
諸多贅述,只是希望能使入門級朋友有個思想準備:為何本文示例并非一段代碼,而由這么多松散的部份組成。下面言歸正傳。
基礎平臺:
- IBM T23 / PIII-M 1.13G/ 512M / 5400 rpm, 8M
- Windows 2003
- Postgresql 8.1.x
- JDK 5.0 - update 4 ( 或 JRE 5.0 - update 4)
中間件:
- Hibernate-EntityManager 3.1beta6 :
說明:這是 EJB3 持久層規范的 hibernate 實現。(若未集成 hibernate core, 必須另行獲取。) - Postgresql 8.1.x JDBC Driver
說明: postgresql 客戶端 JDBC 驅動程序。
- 以下可選內容源于 www.apache.org :
common-dbcp: JDBC 數據源連接池中間件( hibernate 缺省情況下采用C3P0),依賴于 :
common-collections
common-pool
說明: hibernate core 對 JDBC 連接池的使用處理得相當好,當代碼在乎數據庫連接的性能時, hibernate core 會根據配置文件 persistence.xml 中的相關配置,透明地配備連接池;若不需要該連接池,將配置文件中與相關的內容取消即可, hibernate core "自適用" 這種情形。
- Eclipse 3.1.x 以上版本
- Eclipse WTP
- Hibernate Tools
- Subclipse: subversion 的 eclipse 客戶端插件
導讀:
本例的操作內容為:1,清除數據庫中各表內容; 2,向數據庫添加用戶 hedan, 角色 friend, 并將新角色賦予新用戶; 3,查詢數據庫中所有用戶及其角色,并將之一一打印。這 3 個步驟分別對應 TestIt 類中的 removeAll, insert, query 三個方法。
下文中步驟 3、4 和 5 的內容是與 EJB3 – Persistence 規范相關的要點所在(請閱讀這些小篇幅的源文件或配置文件中的說明),其它內容相對次要。
本文假設讀者能熟練使用 Eclipse JDT 及 Hibernate Tools, 并熟悉 POSTGRESQL 的基本操作。
創建 java project
- 將 JDBC 驅動程序及 Hibernate EntityManager 相關類庫的 Jar 壓縮包添加到 Project 的 Libraries 中
- 建數據庫 , 標準 SQL 腳本如下( 持久層配置文件中所有數據庫名稱為 testdb, 數據庫帳號/密碼分別為 test/test,可按需修改 ):
CREATE TABLE _USER
(
USERID INT PRIMARY KEY,
USERNAME VARCHAR(64) NOT NULL DEFAULT '',
COMMENT VARCHAR(256)
);
CREATE TABLE _ROLE
(
ROLEID INT PRIMARY KEY,
ROLENAME VARCHAR(32),
COMMENT VARCHAR(128),
CONSTRAINT NQ_ROLE UNIQUE(ROLENAME)
);
CREATE TABLE _USERROLE
(
USERID INT,
ROLEID INT,
CONSTRAINT PK_USERROLE PRIMARY KEY(USERID, ROLEID),
CONSTRAINT FK_UR_USER FOREIGN KEY(USERID) REFERENCES _USER(USERID),
CONSTRAINT FK_UR_ROLE FOREIGN KEY(ROLEID) REFERENCES _ROLE(ROLEID)
); - 為 java project 添加 EJB3 實體類
如 User.java , Role.java , Userrole.java , UserroleId.java 所示, 這幾個源文件中包含了 EJB 3 annotations,閱讀其中的標記需要參考規范。
可以參照數據庫中各表手動創建各類,最方便地辦法是利用 CASE 工具,本例實體類由 Hibernate Tool beta 4 自動生成。 - 為 java project 創建主程序類 TestIt,本例的 "業務" 實現于其中 , 代碼如附錄 TestIt.java 所示。請閱讀源代碼行中的注釋說明。
- 創建 EJB 3 持久層配置文件 META-INF/persistence.xml
- 創建 Log4j 配置 log4j.properties , 此時, 示例工程結構最后如下圖所示 ( 前文中描述了示例工程必要的文件,下圖中包含而前文中未提到的文件不是必須的 ) :
- 啟動 TestIt 中的 main 方法,運行結果如下圖中高亮部份所示
若需完整的示例工程,請訪問: svn://simsol.vicp.net/ejb3_persistence_hem , 在下使用的并發版本管理系統為 subversion ,而不是 cvs, 您可能需要從 http://subversion.tigris.org/ 去獲取相關資源,為此可能給您帶來稍許麻煩,在此表示歉意。
文中不周之處,請多多指教!