上一章,簡單的對於Entity Object做了一些簡單的說明,也許有一些尚未說到,但是會於後面漸漸補充,這一章的重點,將會在於一些Business Rules的制訂,所以示範的範例較多,希望可以讓大家對於一些基本的Validation有相對的認識。
在ADF BC中,我們先來介紹Entity Object,回想一下,Entity Object通常代表一個實體的DB的Table或是View,首先,Entity Object共分成三個部分:
1. EntityImpl
2. EntityDefImpl
3. EntityCache
其中我們可以發現,當我們基本的Entity Object Create起來後,通常會包含一個Entity Class和一個XML File,如下圖所示:
其中,EntityImpl通常是代表Entity Object的實體Class檔,以Employee為例,ADF BC會Create一個實體Class檔,就是EmployeesImpl.java,這個Class檔是EntityImpl的子類別。
其中,ADF BC將會基於EntityImpl來產生Entity Object Instance,每一個Instance是代表實體Table中的每一筆Row,而EmployeesImpl.java將會有將資料做新增、修改和刪除的相關Method。
我們先點Employee這個Entity Object,可以在上圖中看到,當你打開Entity Object Editor,如果你尚未和DB連線,你就需要先行登入,如下圖:
當我們已經打開,我們可以觀察到Entity Object有相當多的Attribute,接著我們將來介紹EmployeesImpl。
我們點到Enployee這個Entity Object,我們可以在系統導覽區看到Source分類下,有Employees.xml和EmployeesImpl.java這兩個檔案,我們可以按下右鍵,並且選擇Open,將可以打開EmployeesImpl.java這個檔案。
我們可以看到關於EmployeesId的JavaBean屬性,有一組getXXX和setXXX的屬性組,只要有一個Attribute,就將會有一組JavaBean的屬性組,如下圖示:
在此值得一提是getXXX和setXXX,其中因為EmployeesImpl是延伸由EntityImpl而來,所以以getEmployeesId為例,也是延伸由getAttribute而來,其中重要的是,當你已經使用EmployeesImpl的getXXX或是setXXX都可以保證型態轉換正確,但是如果直接使用getAttribute等等的Method,將不保證型態是正確的,可能會於Complier-error或是Run-time error等等,所以一般建議直接使用子類別提供的getXXX和setXXX等等Method。
Entity Object可以放Business Rules的制訂,我們可以在實體的Entity Object的Class檔中設定,例如可以直接修改setEmployeeId這個Method,可以插入相關的程式碼,訂製你所需要的行為。
另外一個值得一提的是,我們都知道每一個Employee Entity Instance都是代表實體資料庫中的每一筆Row,所以Entity Object中有相關的Create和Delete的Method,意味當有一個Instance建立時,會觸動Create的Method,所以你當然可以放一些相關的程式碼,做一些當你Create時,所需要處理的程式,下面有相關說明:
可以針對Employee這個Entity Object打開Entity Object Editor,可以選到Java的分類,你可以看到第一個紅色框框,當你Default Create出Entity Object時,這個勾勾 Default會勾起來,所以你會產生一個EmployeesImpl.java這個檔,當你將勾勾拿掉,Oracle JDeveloper會將EmployeesImpl.java刪除掉,有些狀況,你可能不會需要這個檔案,所以你可以將這個檔案刪掉,這樣可以增加一點點相關的Performance,但是一般建議保留,因為應該差不了多少。
前面我們已經提過,可以放入一些Method在Entity的Class檔中,例如需要新增一筆Row,需要同時新增一些Rule,可以將Create Method這個勾勾打勾,程式碼會自動幫你加入
如下圖,已經將Create Method的勾勾打勾。
當按下確定,Oracle JDeveloper會自動Create程式碼。
如下圖,我們可以5728導覽區選取Employees這個Entity,然後可以在結構區選到EmployeesImpl.java這個檔案,我們可以看一下程式碼有沒有 Create好。
可以看到Create這個Method已經Create好,可以按下右鍵選,【Go to Source】。
可以看到已經Create好相關程式碼,你可以加入自己的程式邏輯。
緊接著,我們已經看到Entity的實體Class檔,接著我們可以看到有一個XML檔,Employees.xml是代表Entity的Metadata,也就是描述該實體Entity所代表的Table的Metadata,也就是類似Table的欄位名稱,欄位長度等等。
所以你可以看到下圖,代表Employees這個Entity的Metadata,例如:EmployeeId,會定義包括欄位名稱,欄位型態等等,一般來說,都比較不會去動這個XML File,如果你需要動態更動Metadata,下面我們會介紹如何做。
當你需要更改Entity的Definition,一般來說,Oracle JDeveloper會幫你Create出Default的XML File,但是如果你需要動態更動這樣的定義,可以將第二個紅色框框打勾,Oracle ADF BC將會Create出一個Class檔來替代這個XML File,所以你可以加入一些相關的程式碼或是加入一個可以影響整個Entity的Method。
第一個紅色框框是代表Entity Collection Class,這個Class檔是代表Entity的Cache,你可以加入相關的程式碼,可以來操控Entity Cache。
其中需要說明的是:
EmployeesImpl是extend EntityImpl 這個Class檔,所以當如果你需要利用或是操控Attribute的值,你可以選擇EmployeesImpl中的getXXX這樣的Method來使用,這些Oracle都是保證型態安全,但是如果你用EntityImpl這樣的Class檔,你需要用到getAttribute這樣的Method,但是需要進行型態轉換,否則將會得到錯誤。
關於EmployeesDefImpl或是EmployeesColImpl都是各自Extend EntityDefImpl和EntityColImpl這兩個Class檔,關於詳細的操作或是JavaDoc都可以在Oracle JDveloper的Help裡找到,所以可以好好善加利用。
以下我們將開始介紹範例,歡迎大家繼續看下去。
第一個範例:建立薪水不能超過 30000 元的Business Rules。
第一部份,我們要建立利用Entity Validation Rules來定義我們的Business Rules。
其中包括Oracle JDeveloper所Default提供的相關元件,慢慢看下去。
先選Employees這個Entity Object,並按下右鍵,且選擇Edit Employees。
當你開啟了Entity Object Editor,你可以看到有一個選項是【Validation】,你可以選到這個Node,可以看到有List所有的Attribute。
因為我們需要對薪水設Validation,所以我們先點到Salary這個Attribute。
這是針對Salary這個Attribute所需要定義的Validation Rules Definition。
針對Rules的形式,共有包括CompareValidator、ListValidator、RangeValidator或MethodValidator,共有四種固定的Rules方式,等下都會一一說明。
所以我們先選著Rules:CompareValidator,接著我們先看一下Attribute,因為我們是需要針對Salary,所以Default會選到Salary,但是你可以動態更改,一樣會是代表你所選的Attribute的Validator,例如:如果我去選HireDate,則一樣會去代表HireDate的Validator。
你可以選擇條件,例如選取等於或是小於等等,所以你可以選取你所需要的。
所以我們選到Operator是LessThan,而Compare With則是有三個型態,包括可以來自於一個固定數字、一段SQL的第一筆資料或是一個View Object的Attribute,所以你可以取到你所需要的。
例如你在Compare With選到Query Result,代表你需要比較的是一段SQL,所以你可以在中間輸入SQL,但是因為是比較單值,所以是代表這段SQL的第一筆資料列的第一個欄位。
所以又在CompareWith選到View Object Attibute,代表是和這個View Object的第一筆資料相比,所以也是一個值,但是隨著View Object Attribute而變。
回歸我們的範例,所以我們像下圖的選擇,固定值輸入30000,並且在Error Message輸入【企業員工的薪水不能超過上限】,所以整個Validator是代表員工的薪水要小於一個數值,而這個數值是 30000。
所以你可以看到已經新增一個Validation Rules,這樣Attribute就會受到規範。
我們可以上圖按下確定,並且繼續打開Business Component Browser,在HrAppModule下按下右鍵,選擇Test,然後按下Connect,則可以打開Business Component Browser,如果不清楚,請參閱前面的章節。
我們點到EmployeesView1這個View Object。
我們將員工編號是100的員工的薪水,從18000調整為30001元,所以他的薪水將會超過30000元,我們可以看到下面的結果。
可以看到Business Component Browser會丟出一個Exception,並且將你所設定的Error Message秀出來,可以按下OK。
你可以按鍵盤的ESC鍵,將可以把薪水回復回來,方便使用。
可以看到多了一個EmployeesImplMsgBundle.java這個檔,會去定義你的Error Message。
所以你可以看一下他的相關程式碼。
Unable to render embedded object: File (Oracle_JDeveloper_Ch7_img_34.jpg) not found.
接著,我們將這個功能做了簡單的示範,以下會做一些不同功能的說明,先來介紹ListValidator。
因為ListValidator是確定在某一些特定List內,而Operator則分為In或是NotIn。
你可以選擇一些固定的值,或是一段SQL,或是一個View Object Attribute的第一筆資料,可以參考前面的說明。
第三個是RangeValidator,是代表Validate一個固定的範圍,所以你可以選擇Between或是NotBetween,可以輸入最大值以及最小值。
當然所有的方式,都可以去控管某一個Attribute的行為以及Business Rules,所以我們又稱為Attribute-Level Validation。
接著我們來看另一種方式,就是Validation Rules,你可以Create一個Business Rules的Class檔來和Entity Validation來做結合,所以一下我們將要示範這樣的作法。
首先我們必須先將此Class檔產生,此Class稱為Validation Rule Skeleton Class,
你必須先在Model的Project部分,先行按下右鍵,選擇Project Properities。
首先先到Business Components下,你必須要先來Registered Rules。
所以你需要點到Registered Rules這個Node,並且按下New。
因為我們必須建立一個Class是來確定【最小長度限制】的相關功能的Validation,所以將名稱改成minLengthValidation,而Package改成hr.model。
如下圖的更改。
當你按下確定,你可以看到你的Project Properities會有一個Validation先行註冊。
你可以回到導覽區,可以看到有一個Class檔已經被Create好了,名稱為minLengthValidation.java,同時間,下面的架構區會顯示此Class檔的成員。
接著,按下你可以點二下minLengthValidation.java,並且幫你開到主要編輯區,所以你可以看到有一下的Tab分類,因為我們必須要Create一個屬性來接受我們的Validation的最小長度的數值為何,所以我們先點到 Class 這個Tab。
我們可以利用Oracle JDveloper所提供的Class Tab來增加一個屬性,按下Add。
輸入欄位名稱:minLength,型態選擇int。
如下圖的畫面設定。
按下確定,你可以看到可用的欄位多了一個,等會我們來看一下程式。
我們可以回到系統導覽列,我們可以先點到minLenghtValidation.java這個檔案,
接著看一下下方的架構區,可以看到程式的大概架構,已經有多一組getXXX / setXXX的Method,其中屬性的名稱是minLength,所以等會可以看一下程式,另外重要的是,我們需要去將 validateValue 這個Method,新增你自己的Business Rules,所以等會會有詳盡的說明。
所以我們可以在validateValue這個Method上按下右鍵,選Go to Source這個功能,將可以幫你直接找到程式中的位置。
所以Oracle JDeveloper會幫你找到程式的validateValue這個Method,方便你使用。
剛剛我們加入一個屬性,同時會包含一組getXXX和setXXX的Method。
我們可以加入我們所需要判別的程式碼,我們確定需要加入Validation的欄位,所可以輸入的值,不能小於Validation所設定的值,否則回傳False。
我們已經將相關的Validation Rules寫好了,接著,我們必須要自訂Exception的相關錯誤訊息的設定,所以我們可以找到vetoableChange這個Method所以我們在程式結構區,在vetoableChange中按下右鍵,選Go to Source。
Oracle JDeveloper會幫你帶到程式碼區,並且找到vetoableChange這個Method。
因為ADF會幫你帶好Default的錯誤訊息,所以你可以更改成你所喜好的訊息,但是一般來說,如果你釘死在程式碼,難免會比較不好使用,且重複使用性也不好,所以可以將內容更動成this.getDescription,因為我們有一個屬性是Description,所以可以動態來抓取Description。
我們先將剛剛我們所修改或是新增的部分,先行存檔。
接著我們必須要將剛剛的Validation Class加入Project,所以我們需要在Model這個Project上按下右鍵,選Add to Project,將此Class加入。
Oracle JDveloper會開啟檔案開啟的對話框。
我們將目錄切到HRES\Model\src\model下,選擇剛剛我們所新增的Validation Class:minLengthValidation.java。
因為Validation Class已經加入,所以可以開始選擇那一個欄位需要有此條件的驗證,所以如圖開啟Entity Object Editor。
我們一樣選到Validation這個Node,準備選擇相關欄位。
我們先針對FirstName這個欄位來加入Validation,所以點到Validation這個Node,並且選到FirstName這個選項。
我們可以將Rules選到我們之前所建立的Validation,也就是minLengthValidation,所以你可以將Rule選到minLengthValidation。
當你選到minLengthValidation這個Validation Rules,可以明顯看到會出現之前所建立的兩個屬性,在minLengthValidation.java裡的兩個屬性。
可以在description中輸入錯誤時所需要顯示的Error Message,在此輸入如下的敘述,可以在minLength這個屬性,輸入最小長度的限制,目前設為3,按下確定。
如下圖,FirstName已經加入Validation,所以接著可以對於LastName做相同動作。
如下圖,依此下列條件進行Validation Rules做設定。
如下圖,你已經將FirstName和LastName兩個Entity Attribute設定好相關的Validation Rules。
當你按下確定後,Oracle JDeveloper會進行實體Class和相關的XML檔的程式異動,所以會出現下面的圖。
接著可以針對Model Project做整體的Rebuild,也就是整體程式的重新編譯。
當程式已經進行編譯後,可以啟動Oracle Business Browser,可以在HrAppModule上按下右鍵,選Test來開啟Oracle Business Component Browser。
直接按下Coonect,如果有所不清楚,可以看一下前面的章節說明。
當Oracle Business Component Browser已經打開,可以點選到EmployeesView1這個Node,來打開EmployeeView這個View Object。
我們先選到EmployeeId為102這個員工,可以看到FirstName為Lex。
我們可以將FirstName的值從Lex更改到Le,因為我們已經規定FirstName的Validation Rules是最小的長度是 3,所以改成Le,會造成Validation Error。
我們可以點到下一筆,如下圖所示,點該選項。
你會得到一個Validation Error,如下圖所示,代表你的FirstName必須最小長度是超過3。
我們可以按一下ESC,可以將剛剛更改過的值回復,接著我們將LastName的值從De Haan更改成De,將會進行LastName的Validation。
接著,我們一樣按到下一筆資料,如下圖所示。
你也會得到一個Validation Error,因為LastName是必須是最小長度要超過4。
以上是Validation Rules的相關範例,可以試一試。
我們已經談了一些 Validation Rules 的方式,接著我們來談 Validation Domain,
可以使我們的 Attribute 符合某一種格式,以下我們舉個例子:
先將 Business Components Diagram 打開,可以看到我們之前建立的Diagram圖。
我們將Component Palette打開,如果你看不到,可以到標題列中的View分類,可以將Component Palette打開,接著我們將Domain點一下。
將Domain拉到這個Diagram的空白處。
如果你已經和資料庫離線,Oracle JDeveloper會先行要求你登入。
Default會將Domain的名稱設定為Domain1。
所以我們將Domain的名稱更改成PhotoNumberDomain。
如下圖,如果你名子取錯,不能改,請直接將Domain移除,重新加入。
可以看到Navigator的視窗中,看到已經多了一個PhotoNumberDomain這個關於欄位PhotoNumber的Domain。
Domain會建好一個Class檔和一個XML File,你可以依下圖,先將Class檔編譯。
當你已經打開PhotoNumberDomain.java的Class檔,可以先去找到Validate這個Method,這個Method是需要去Implement Validation Code,所以我們點著這個Method,按下右鍵,選Go to Source。
首先先來關心一下這個Class檔,可以知道mData就是該欄位當時的值,所以最後會出叫Validate這個Method,所以我們需要去Validate這個Method中加上我們的Validation Clode。
因為這個欄位是電話格式,所以我們利用正規式的比對,程式碼如下:
先行存檔一下。
我們已經建好Domain,我們可以來設定何欄位要來設定
打開 Entity Object Editor,並且選到PhoneNumber這個Attribute。
將Attribute的Type往下拉,選到hr.model.common.PhotoNumberDomain這個選項,確認PhoneNumber的Type改成此Domain。
當我們已經選到相關的Domain ,可以發現Database Column已經被改成是Oracle的VARCHAR2(255),但是因為真正是只有VARCHAR(20),所以要手動改回。
如下圖,已經還原真正Database Column的Type。
按下確定,Oracle JDeveloper會開始建立相關程式。
一樣地,我們進去ADF Business Component Browser看一下測試結果,按一下Test。
如下圖,按下Connect。
請點到EmployeeView1這個Node。
我們將PhotoNumber加上一個8,也就是515.123.45678,將會不符合我們剛剛對於PhotoNumber所設定的Domain,所以當我們瀏覽到下一筆,我們可以看到ADF會丟出錯誤訊息。
如圖,ADF 會丟出我們所自訂的錯誤訊息。
另外來說,我們來看EmployeeId是148這個員工,當電話是011.44.1344.619268,我們可以將前面加上 1。
如下圖,我們已經更改PhotoNumber,我們可以接著按瀏覽下一筆。
你將可以得到一個錯誤訊息,因為你給了一個不符合的格式。
接下來,我們來看一個另一種Validation,剛剛我們都是看到關於某一個attribute,現在我們來看如何做整個Entity Level的Validation。
先將Employees Entity Editor 打開(確定經理級,薪水的限制)。
如果需要做Entity Level的Validation,需要在Java這個Node,點選特定的選項,ADF 會自動幫你 Create 撰寫Validation的Code。
你可以在Validation Method的框框打勾,ADF將會幫你Create好相關的Method,你可以將Validation Code寫到那裡,將會在下面介紹。
ADF自動Create中…..
當你建立完成後,你可以在EmployeesImpl.java中看到這個Method。
按下右鍵,並且選擇Open。
接著,可以先往Structure區中看一下,可以找到一個Method,名為validateEntity這個Method,會扮演控制整個Entity Validation的角色,選一下右鍵,並選Go to Source。
可以看到 Oracle JDeveloper幫你帶到validateEntity這個Method。
輸入一下程式碼,如下圖,你打上JboException,可以按下Alt+Enter來Import Class
如下圖,我們選racle.jbo.jboException,這樣ADF才能抓到相關Exception。
以下程式碼則是當Job ID是VP或是PRES結尾的,代表此人是經理階級,所以補上檢查薪水不應少於多少,以下依此類推。
先行存檔。
準備進行測試,可以進入Business Component Browser進行測試,按下測試。
選擇 Connect。
當我們看到員工編號是 100 的,我們看到JobId是AS_PRES,所以代表是經理階級,所以薪水必須是大於15000,所以當你進行薪水異動,將會產生Exception。
已經將薪水更動成13000。
你會得到以下的Exception,藉由JobID再去Validate薪水的欄位。
接著,我們看到103這個員工編號,他的JobID是IT_PROG,所以乃是非經理階,所以薪水最高是14999,如果超過,將會得到Exception。
將薪水更動成18000元。
你可以得到非經理階的Exception,所以可以控管整個Entity Level的Validation。
所以我們可以按下ESC來還原剛剛所設錯的值。
關於Entity Object的部分,將於這個章節結束,下一章將會介紹Data Model,等待介紹到JSP後,會將整個ADF Framework發揮出功用,所以現在只是瞭解ADF的一些相關細節,繼續加油喔。