WebObjects/EOF
WebObjects 具有兩個方面。一方面,它將關係資料庫或其他永續性資料來源轉換為物件圖,即相互連線的物件組。另一方面,它使用模板將物件圖轉換為 HTML。第一個方面是 EOF。EOF 橋接了關係資料庫的世界和物件的世界。換句話說,EOF 允許您從資料庫開始,構建代表您想要在資料庫之上執行的操作的 POJO(POJO = "Plain Old Java Object"),以使其更智慧,更能響應您的目標受眾。
如果您來自關係資料庫環境,您可能已經接受過以表格、行、列、聯接、笛卡爾積、結果集等方面的思維方式進行訓練。只要您繼續用這些術語來思考您的應用程式,WebObjects 將頑固地站在您和成功之間,在您找到 SQL 解決方案的快速方法時,透過施加大量“便利”來阻礙您。應用程式下的模式設計很重要,但模式設計與資料庫設計不同。EOF 為您提供了一層抽象,覆蓋了簡單的關係資料庫。
如果您能理解面向物件的概念,使用面向物件的集合類,如陣列(或向量)、集合、字典(或雜湊表),並以您正在使用的物件圖的思維方式思考,您會發現 WebObjects 是一項非常支援且有幫助的技術。與所有複雜技術一樣,它有自己的故障和錯誤,但對於表面下令人難以置信的複雜性來說,這些故障和錯誤出奇地少。
使用 EOF 有兩種方法。它既可以用作使現有資料庫更靈活的方法,也可以用作在開發的應用程式中持續儲存模型的方法。它既被那些先在白板上建模然後編寫程式碼的企業家使用,也被擁有 15 年曆史的資料庫、遺留程式碼和系統並且必須使其更靈活的企業使用。
如果您已經有了一個數據庫,最好的入門方法是反向工程模型。如果您在 Mac OS X 系統上安裝了 WebObjects,您有一個示例資料庫和一個 JDBC 驅動程式。
瞭解 WebObjects 對您的意義的最佳方法是將您的 EOModel 仔細地看成一個 ER 圖。在 EOModeler 中開啟您的 EOModel,並切換到圖形實體關係檢視(EOModeler 視窗左上角的小彈出視窗)。該視圖表示您模型物件的圖。透過拖動重新排列實體,以使線條交叉儘可能少,以便您可以清楚地看到圖表。完成此操作後,您可能希望將其打印出來以方便訪問。如果您使用的是 Mac,一個簡單的做法是擷取螢幕截圖,然後您可以將生成的 .pdf 檔案打印出來,並將其縮放為一張紙。
請注意,該圖上每個實體中的屬性名稱是官方 EOModel “屬性”名稱,而不是資料庫列名稱。如果您要求 EOModeler 建立每個實體的 java 類檔案,java 成員名稱(ivars 和方法名稱)也將與這些名稱相對應。這是以 WebObjects 方式思考的第一步。在任何操作中都考慮這些官方“屬性”名稱,而不是資料庫列名稱。
在您理解了模型之後,下一步是獲取一些資料。選擇一個您感興趣的實體。為了在您的應用程式中例項化該實體的一組物件,您通常需要建立一個 EOQualifier,以便從您物件儲存中所有存在的例項中選擇合適的例項(請注意,我說的是物件例項,而不是錶行,以及物件儲存,而不是關係資料庫;您必須習慣於思考物件)。
假設您有一些 Employee 和 Department 記錄,並且您想要獲取所有在您部門工作的 Employee,以便向他們傳送部門年終聚會(EOYBO)的邀請函。此外,假設您的 Employee 和 Department 實體具有以下屬性
Employee lastName firstName lengthOfService ... Department name location division
如果您只想要特定性別的員工,例如“female”,最簡單的方法是使用 EOUtilities 作為一種便捷的快捷方式來進行簡單的查詢。
myEditingContext = session().defaultEditingContext(); NSArray femaleEmployees = EOUtilities.objectsMatchingKeyAndValue(myEditingContext, "Employee", "gender ", "female");
這裡有很多內容,但您可以在 EOUtilities 文件中查詢該方法以檢視引數的含義。無論如何,一旦執行此語句,您就獲得了您正在查詢的員工的 NSArray。(也查閱 NSArray 並將其與 Java 的 Array 或 Vector 進行比較,它們是類似的)。不幸的是,僅僅透過特定值與給定屬性進行比較有點侷限性,因此更長但更靈活的方法是建立一個 EOQualifier,然後在獲取規範中使用它來獲取您的初始物件。建立限定符的最簡單方法是使用魔法方法,“qualifierWithQualifierFormat()”。使用這些工具,我們可以獲取我們最初要找的員工,即我們部門的員工。我們可以這樣操作
myDepartmentName = "Information Technology";
EOQualifier myQual = EOQualifier.qualifierWithQualifierFormat("department.name = %@", myDepartmentName);
EOFetchSpecification myFetcher = new EOFetchSpecification("Employee", myQual, null);
EOEditingContext myEC = session().defaultEditingContext();
NSArray employeesToInvite = myEC.objectsWithFetchSpecification(myFetcher);
我們再次獲得了一個 Employee 陣列,但使用了一種稍微更難的方法。但是請注意,我們要求資料庫為我們進行聯接,方法是在限定符格式中使用“department.name”結構。這意味著,獲取與名稱為... 的部門物件連線的員工。當然,它的優勢在於魔法方法,qualifierWithQualifierFormat() 允許我們構建一些非常複雜的限定符,並且可以輕鬆地構建它們,例如
EOQualifier myQual = EOQualifier.qualifierWithQualifierFormat("(department.name = %@ and age > %@ and boss.gender = %@) or gender = 'female'", myDepartmentName, new Integer(40), "male");
困難的部分已經完成。現在只剩下 WebObjects 作為面向物件程式設計師為我們提供的簡單內容了。假設對於每個員工,您想要透過向他們的老闆傳送郵件來安排他們的 EOYBO。還假設,老闆和員工一樣,都是 Employee,因此具有相同的屬性,如上所示。只需遍歷 Employee 陣列,並詢問每個物件其老闆的電子郵件地址,然後傳送邀請函,如下所示
Enumeration enum = likelyEmployees.objectEnumerator;
while (enum.hasMoreElements()) {
Employee anEmployee = enum.nextElement();
sendScheduleRequestTo(anEmployee.boss().emailAddress());
}
請注意,我們不需要任何其他獲取規範或限定符!WebObjects 透過其企業物件框架自動識別了對更多資料庫記錄(老闆)的需求,並直接為我們獲取了這些記錄,而無需更多明確的獲取操作。
當然,有人必須編寫“sendScheduleRequestTo(EMailAddress addr)”方法,但是有很多庫可用,而且您可能對 Java 非常熟悉,可以自己完成。
重點是,我們不必為老闆進行額外的明確獲取操作,因為 WebObjects 為我們完成了。它基本上執行了聯接操作,併為我們提供了結果,而我們卻不知道。只需使用獲取操作獲取您的第一組物件,然後按照物件圖進行操作。
忘記結果集、聯接、選擇和其他所有關係資料庫工件。或者,至少在您遇到麻煩之前,忘記它們,以某種方式獲得您想要的結果。如果問題很嚴重,請設定 WebObjects 執行時引數,-EOAdaptorDebugEnabled YES,EOAdaptor 將將其生成的所有 SQL 傾倒到您的執行日誌中,以便您可以準確地瞭解它正在為您做的事情(或正在對您做的事情)。 :-)
但是,在您開始構建第一個對您至關重要、人命關天的、無錯誤的 WebObjects 程式之前,您應該看看“管理物件圖的常規指南”。它更深入地介紹了我在這裡提到的某些概念,而且寫得非常好。
您可以在 Apple 文件中找到它:/Developer/Documentation/WebObjects/Reference/API/com/webobjects/eocontrol/concepts/EOEditingContextConcepts.html#GENERALGUIDELINES
或
/Developer/ADC Reference Library/WebObjects/Reference/API/com/webobjects/eocontrol/concepts/EOEditingContextConcepts.html#GENERALGUIDELINES
當然,這是更大頁面中的一個 HTML 片段,所有內容都值得一讀。
無論如何,祝您 WebObjects 未來好運。