第六章-Oracle ADF Business Component

来源:互联网 发布:自学西班牙语 知乎 编辑:程序博客网 时间:2024/05/04 06:36

經過第五章 ADF Component 的導覽,應該可以針對整個 ADF 有基本並且初步的認識,我們都知道,整個 Oracle ADF BC 共包含 Entity Object、Association、View Object、View Link以及 Application Module,在本章的章節中,我們將會談及 Entity 的部分,包括 Entity 部分的介紹,Association 的介紹,基本Validation的設計說明,都是本章的重點。


 在整個 ADF BC(ADF Business Component)中,最底層部分是【Entity Object】,其中 Entity Object Definition可以是代表一個實體的 Table 或是 View,每一個Entity Object Definition都有很多的 Entity Attribute,則是代表Table的Column,而其中的關係,可能在兩個 Table 中會有所謂 Foreign Key 關係,而在 Entiy和 Entity 中的關係,我們稱為 Association,舉個例子,以 HR 為例。


 我們可以參考第四章的方式先行建立一個 Business Component Diagram。


 以下將會在範例中陸續說明:


 以下將會建立一個 ADF BC 來進行說明,說明相關 Entity 部分的東西。


 先行在 Applications 按下右鍵,先行 New 一個新的 Workspace。


 輸入建立 Application Workspace 的相關資訊,在 Application Workspace 輸入 HRWS,並在 Prefix 中輸入 hr,接下來按下確定。


 可以先行存檔,先行建立一個 Workspace。


 因為需要增加一個 ADF BC,所以在 Model 的 Project 按下右鍵選 New。


 利用 Business Component Diagram來建立 ADF BC,所以在 Business Component的分類下,選取 Business Component Diagram。


 在 Business Component Diagram 的對話方塊中,將名稱取為 Business Component Diagram,以及 Package 取名為 hr.model。


 當 Business Component Diagram 已經建立,會先行建立一個空白的 Diagram,你可以將相關的 Table 拉到 Diagram 中,並且建立相關的 UML 圖。


 你可以將 Connection 中的 HR Connection 打開,裡面包括很多的 Component,其中包括 Table、View和一些相關的部分,包括 Procedure、Package或是撰寫相關的 Triggers或 PL/SQL 的程式。


 可以將我們所需要的兩個 Table,包括 Departments和Employees,拉到右邊的Diagram 中,會產生相關的 Entity,在之前提過,每一個 Entity 代表是一個


 實體的 Table 或是 View,所以我們將兩個 Table 拉入 Diagram 中。


 在此可以 Default 按下確定,確認會建立 Business Component Object。


 當你將相關所需要的 Table,拉到主要的編輯區,Oracle JDeveloper 會自動幫你Create 好相關的 Business Component 的相關 File,包括實體 Class File 和 XML File 。


 以下會針對 Department 和 Employee 這兩個 Table,所建立的相關檔案,其中包括 XML File 和實體的 Class File,其中以 Department 這個 Table 為例,會產生兩個相關檔案,包括 Departments.xml 和 DepartmentsImpl.java 這兩個檔案,其中 DepartmentsImpl 是實體代表 Department 的 Entity Object 的實體檔案,而 Departments.xml 則是代表描述 Department 這個 Entity 的相關屬性,


 所以將會在下面再說明,另外再增加兩個 Table 的 relation的 XML File。


 如下圖所示,已經將兩個 Table 所建立的 UML 圖,建立於主要編輯區,以下將會一一說明。


 這個 UML 圖可以使用 Layout Shapes 來進行圖形的排列,共有六種排列方式,你可以選擇最喜歡的方式,可以在空白處按下右鍵,並且選擇。


 以下則是選取 Hierarchical(Right to left)的相關圖。


 可以針對 Employees 這個 Entity 來說明,可以直接點選 Employees 這個圖,將可以打開 Entity Object Editor,如下圖。


 以下是 Entity 的全觀,包括當時是代表哪一個 Table,以及相關 Table 的Column則是代表 Entity的 Attribute,包括 EmployeeId、FirstName等等,另外也包括設定相關的 Entity 的 Validation,以及設定一些相關設定,會於後面依序說明。


 以下是 Entity Attribute 的相關設定圖,包括設定名子、是代表哪一種型態,或是屬不屬於 Persistent(持續) 的欄位,也就是說是不是當 Update 後,需要更動對應的 Table 的 Column 值,


 以 EmployeeId 為例,名稱為 EmployeeId,而其中的 Type 則為是 Number,而其中欄位的說明概述如下(列舉幾項):


 Persistent:


 代表此 Attribute 和 Table 中的 Column 是保持 Persistent,因為當如果從Database的Table所Create出來的Entity Attribute,則所有Attribute都會自動勾選此欄位,所以當Attribute的值更改後,將會連動的更動Column的值。


 Mandatory:


 如果Table中的Column是有Not Null的限制,則此欄位將會自動選擇,所以此欄位代表此Attribute的值是否為Null。


 Primary Key:


 代表此欄位在Table中是代表Primary Key,可以使ADF BC來分辯不同的Entity Object,就好像可以分辨在Table中不同的Row,所以即使Table沒有設定Primary Key,Oracle JDeveloper會自動幫你建立RowId的Attribute,則是對應到DB中的ROWID這個Column,而這個Attribute所代表的Data Type為oracle.jbo.domain.RowId。


 PS:jbo則是代表Java business object,Oracle 取的。


 Unique:


 在Table中,我們可以針對某一個Column制訂Unique的Constraints,


 當Table已經有此Constraints時,同時間Create出相關的Entity Object


 也會在此欄位打勾,代表所有的Entity Object中該Attribute的值都不


 會重複。


 Queriable:


 此欄位是代表該Attribute是否可以用於View Object的Where中的敘


 述,以View Object是一段SQL的觀念來看,則是代表可否用於Where


 之中,一般來說應該都會打勾,除了Table Column Type 是 LOB。


 Selected in Query:


 如果此欄位打勾,則此欄位可以代表一段SQL,一般來說,是用於


 一些暫存的變數欄位,所以並不是和DB持續Persistent。


 在DB Column中,是代表真實在DB中的實體Column的名稱和型態,如果你進行了更改,也可以利用【同步化】的功能,Oracle JDeveloper將會自動幫你更改相關實體DB中的設定,當然前提必須帳號要有更改的權力。


 接著部分,我們將會來解釋 Association,Association則是代表兩個 Entity Object 的關係,以 Department和Employees 這兩個 Table為例,中間會藉由【部門代號】來進行關聯,也就是 EmpDeptFkAssoc,你可以點兩下並且開啟 Association Editor。


 


 當我打開 Association Editor,可以看到其中左方是代表 Source 部分,一般來說是代表 Master 的部分,而 Destination 部分則是代表 Detail 部分,所以 Department 中的 DepartmentId和Employee 中的 DepartmentId 相對應,當選擇好相關欄位後,可以按下新增,因為我們用 Wizard 產生,所以已經設好。


 其中在 Association Porperties 中,會定義 Source 和 Destination 的 Accessor Name,即是 UML 圖上的兩邊字,例如 Source 邊是 Department1。


 Composition Association將會於專題來討論。


 切換回 Entity Objects的部分,可以看一下Cardinality,代表這個Association的型態為何,包括各種型態,例如1對多或是多對多或是正向1對多等等,都有各自的意義,將會介紹一些常用的,其餘請參考相關文件。


 看一下EmpDeptFkAssoc的accessor name,可以用滑鼠點一下Employees1上,你可以直接編輯名稱,可以取對你有意義的名稱。


 可以直接編輯過後,例如將Employees1改成Employees。


 因為整個Entity Object是從Oracle DB所Gengerate出來,所以每一個Entity Attribute都是代表每一個Table的Column,因為我們需要介紹Transient和 Persistent的Attribute,所以將Entiy Object的範圍拉大,可以留出一格輸入Attribute的空間。


 我們可以假設我們需要一個【津貼總額】的欄位,我們可以直接在圖上的欄位編輯,並且輸入【otherBounds:Number】,即是代表此欄位名稱為otherBounds,而他的型態為Number,Number 是代表oracle.jbo.domain.Number。


 可以點兩下Entity Object的圖,可以打開Entity Object Editor,你可以看到多一個Attribute,當Default Attribute Create好後,會Default將Persistent和Queriable這兩個Attribute打勾,因為我們需要建立一個暫存欄位(Transient Attribute),所以我們需要將 Persistent 的勾勾拿掉,將可以成為一個 Transient Attribute。


 如下圖所示,Persistent Attribute欄位的勾勾拿掉,等會我將會示範怎麼使用。


 因為我們已經完成我們的Business Component,我們需要來建立View Object和Application Module,也就是Data Model Component,可以讓後端的Business Component顯示出來,提供View object和Application Module給前端的User Interface使用。


 可以在空白處按下右鍵,並且選擇 Generate\Default Data Model Components for Diagram 這個功能,來建立Data Model Component。


 直接按下一步。


 更改一下Package的名稱,改成hr.model.datamodel,將Entity Object和Association都選到右邊,準備建立View Object。


 輸入Application Module的資訊,將名稱取為HrAppModule。


 會出現Summary的視窗,可以觀看一下是不是正確,如果都沒有問題,可以直接按下【完成】。


 如下圖可以將整個範例建立完成,接著我們將要來進行一些測試。


 準備將Business Component Browser叫出來,可以執行HrAppModule \ Test。


 直接按下 Connect。


 如同以下可以打開Oracle Business Component Browser。


 可以先行點選DepartmentsView1這個Node,可以將DepartmentView給顯示出來。


 第一個要測試的問題,是要測試欄位的必要性,所以我們將DepartmentId清除,如上圖,將DepartmentId為10,將DepartmentId清空,並按下Commit(綠色)。


 你會在Browser中得到一個Exception,至於為什麼,我們繼續看。


 我們回到UML圖,直接點兩下Departments這個Entity Object兩下。


 如果你還沒有Connect到DB,會出現帳號密碼確認一下,如果已經有Connect,則下面的視窗將不會出現。


 我們可以看到Entity Object Editor,選擇到DepartmentId這個Node,可以看到在紅色框框內的Mandatory有打勾,相當於在DB中時,是代表此欄位是Not Null,


 所以此Attribute也是如此,所以當你清除ID中的值時,將會引發Exception,由ADF BC所丟出,所以像Unique也是一樣,所以當你的Table有此種Constraint時,當ADF BC建好後,將會自動幫你Mapping相關Attrobute的欄位屬性,所以這是最基本的控制。


 接著,我們來討論Persistent Attribute和Transient Attribute這兩種Attribute,我們在Employees中裡看到兩個Attribute,Salary(薪水)和otherBounds(津貼總額),這兩個欄位。


 我們可以點一下Employees Entity,可以開啟Entity Object Editor,我們可以選到Salary這個欄位,可以看到欄位中的屬性有勾選Persistent,代表是和DB會是保持Persistent,接著看一下另一個屬性。


 接著我們看到otherBounds這個Attribute,可以看到Persistent沒有打勾,則是意味是一個Transient Attribute,也就是一個暫存欄位,或是說是一種計算欄位,所以可以Create這樣的欄位,是代表一種計算結果,當某個欄位進行調整,該欄位也會進行調整,但是卻不是實體DB中的欄位。


 回到Oracle Business Component Browser,將剛剛的動作Rollback,可以在此Session尚未Commit前,將資料回復。


 會將剛剛刪除的DepartmentId還原,還原成更改前,所以你可以看到DepartmentId也還原成10。


 我們點到EmployeeView1這個View Object,打開EmployeeId是100的資料。


 將ID為100的員工的薪水從24000調整成18000元,如下圖所示。


 接著在ottherBounds欄位輸入5000元的津貼,如下圖所示。


 接著瀏覽到下一個員工,如紅框框所示,並將101的員工增加津貼2000元。


 接著按下Commit,你可以將資料Update進去DB,亦即資料進行異動確認。


 先將Oracle Business Component Browser關閉,再將Oracle Business Component Browser打開,可以遵循以下步驟。


 按下Connect,可以來Connect Oracle Business Component Browser,再一次打開Oracle Business Component Browser,以期可以再一次Query資料。


 可以看到100的員工,薪水已經更改了,但是津貼卻沒有保存,這就是Attribute是否有Persistent的屬性,因為薪水的欄位有Persistent,所以當我們將薪水從24000調整成18000,當我們經過Commit後,當我們再度打開Browser後,則可以看到資料已經成功的Update,資料有真的Update進去資料庫。


 當我們捲動到101這個員工後,可以看到剛剛輸入的津貼的欄位,因為本身津貼的欄位沒有Persistent的屬性,意味是代表一個Transient Attribute,所以當我們輸入津貼的數目在此欄位,當已經離開該有的Session時,則此欄位就會失效,而且也不會去Update相關的DB的欄位,藉由此,可以建立一些計算欄位,方便先行建立一些Transient Attribute,可以不用往後在程式中一直利用相同方法一直做相關的計算。


 本章介紹Emtity Object的一些基本的東西,下一章開始就是包括Entity 的一些Validation和一些Business Rules的制訂,以及Entity Object的一些基本的技術和觀念,有助於讓你更加瞭解ADF BC的Entity Object,期待下一章。


原创粉丝点击