Eva 與 資料物件 的關係.
資料物件是所有 Eva 所提供的工具裡, 處理資料時的共同核心角色. 在 Eva 所提供的 API 中, 有大半都是用於建立, 或取得資料物件. 而另外一半才是用於如何處理那些得到的資料物件. 對於 使用者 所接觸的物件, Eva 的一貫要求是它們需要由 Eva 所提供, 而非使用者自行去呼叫 new 指令, 或是透過 Java Reflection 功能所建立. 因為必需是經由 Eva 所建立的物件, Eva 才能為它加入更多的處理能力, 像是監控物件建立的事件, 監控物件方法被呼叫的事件, 或如同後面所提到的, 自動維護物件相等性等等特色.
而因為資料物件的種類會跨越了工具的界限, 同時在好幾個場合中用到, 所以我們將物件獨立成一個單元先做介紹.
而因為資料物件的種類會跨越了工具的界限, 同時在好幾個場合中用到, 所以我們將物件獨立成一個單元先做介紹.
Bean.
所謂的 Bean, 是一種特別的類別(Java class), 它的命名方式遵循著特定的規則. 1個Bean可以擁有許多個Properties, 而每個Property至少會擁有1個setter或getter. 而setter與getter是使用者存取物件的方法(method). 1個property的 setter 與 getter 都必須符合特定型式的方法名稱與參數與回傳值. Bean 的使用相當常見, 它也常常是許多工具的處理物件資料時的規格要求, 使用者將有可能在其它不同的使用場合也碰到它. 而對於 Eva 一系列的工具而言, 也藉由在 Bean Properties 中存取資料去完成特定功能.
Entity.
Entity 類別 是Eva_ORM中設定對映的藍圖, 它很像一個 Bean 類別, 在其中也必需含有Bean properties的定義, 但不同的是, 它可以是一個 Java 類別或是 Java 介面, 還有在其型別定義時必須以@Entity做為標示, 除此之外, 該類別或介面當中可能還有其它描述欄位對映的 Annotation 設定. Eva_ORM 將會根據相關的命名與型別轉換設定, 把 Entity 類別與資料庫中的表格(table) 做對映; 將Properties與表格中的欄位(columns) 做對映, 之後就能夠將表格內的記錄讀出, 轉換成Java環境中的Entity物件.
Struct
Struct 類別 是Eva_Struct中設定對映的藍圖, 它也很像一個 Bean 類別, 在其中也需含有Bean properties的定義, 但不同的是, 它只能是一個 Java 介面 或是 Property 定義全為抽象的 Java 抽象類別, 而且在其 Struct 型別定義時必須以@Struct 或 @BitStruct做為標示, 除此之外, 該介面當中可能還有其它描述Property特性的 Annotation 設定. 之後 Eva_Struct 能讓使用者以操作物件的方式讀寫常用於 IO 的位元組陣列.
自動維護好的 物件相等性.
就如同在Joshua Bloch所著的Effective Java中的第3章, 以及Peter Haggar所著的Practical Java中的第2章都曾提到的, 相等性(equality)是一個要小心維護的重要性質. 而 Eva 會自動去維護這項特性, 而不建議使用者自行實作, 以避免使用者去寫出含有bug的程式.
而對於 Entity 定義來說, 用於Properties中最重要的 Annotation 是@Id. Eva_ORM 倚靠 @Id 來維護相等性. 被@Id所標記的Property我們稱它為Key Property; 反之, 我們則稱它為Data Property. 而@Id也將會決定所對映的欄位是不是主鍵(Primary Key), 同時也會決定Entity 物件中hashCode(), equals(), compareTo()方法如何去執行.
而對於 Entity 定義來說, 用於Properties中最重要的 Annotation 是@Id. Eva_ORM 倚靠 @Id 來維護相等性. 被@Id所標記的Property我們稱它為Key Property; 反之, 我們則稱它為Data Property. 而@Id也將會決定所對映的欄位是不是主鍵(Primary Key), 同時也會決定Entity 物件中hashCode(), equals(), compareTo()方法如何去執行.
參考物件 與 數值物件.
在 Java 中, 原本並沒有所謂參考物件與數值物件的分別, 在 Java 中就只有參考物件, 當參考物件變數取值賦值時, 就只是單純物件位址的拷貝. 會有參考物件與數值物件的差別是因為 Eva_Struct 引入了 C 語言中 Struct 的觀念. 在 C 語言中, Struct 雖然佔用不固定數量的空間, 而且可能佔用的空間大於一般的整數, 浮點數數值, 但它仍與一般數值一樣, 在物件變數取值與賦值的時侯會將資料整個複製一份. 在 Eva_Struct 中, 那些負責模擬 Struct 功能的物件, 在透過我們所提供的 API 去做取值賦值的時侯, 其行為會如同 C 語言中的 Struct 一樣, 是整個資料的拷貝, 稱之為值物件.
而參考物件中的 equals 方法, 其預設行為是比較物件的位址, 但數值物件中的 equals 方法, 其預設行為會比較物件的全部數值內容. 但若存在 Key Properties 時, 兩種物件 equals 方法的預設行為都會變成比較 Key Properties 的內容.
而參考物件中的 equals 方法, 其預設行為是比較物件的位址, 但數值物件中的 equals 方法, 其預設行為會比較物件的全部數值內容. 但若存在 Key Properties 時, 兩種物件 equals 方法的預設行為都會變成比較 Key Properties 的內容.
空白物件.空白的物件是由使用者主動建立的物件. 使用者可以使用 ORMapper 物件的 newObject 方法來建立空白的參考物件, 或使用 StructMapper 物件的 ptr 方法, 或是 BitStructMapper 物件的 ptr 方法來建立空白的值物件.
唯讀的物件.唯讀的物件只能讀資料, 不能更改資料, 例如從 Eva_ORM 中取得的物件, 若它是從資料庫中讀取而來, 或雖是空白物件但己被新增自資料庫, 則它們都會被自動轉變成唯讀的物件, 以防止使用者做單方面的資料更改; 反之, 若是令 Eva_ORM 去刪除一個唯讀的物件, 該物件又會變回可讀寫的空白物件, 可重新被新增回資料庫.
條件物件.條件物件, 其型別為 ConditionObj<T>, 其型別參數 T 說明該物件是 T 型別的條件物件. 條件物件顧名思義可用於描述查詢, 更新, 或刪除資料時的條件, 它們可同時用於 Eva_ORM 與 Eva_Cache 的操作. 使用者若想向資料庫或向 Cache 做具條件的操作時, 條件物件的取得, 需要透過相關的 ORMapper 物件所提供的 newCondition 方法.
修改用物件.修改用的物件, 顧名思義為用於修改資料時的物件, 主要用於 Eva_ORM 去修改資料庫內的記錄. 修改用的物件, 其產生方法有兩種, 一種是透過相關的 ORMapper 內的 newModification 方法去建立, 另一種是透過 ORMapper 內的 shallowCopy 與 deepCopy 方法去複製唯讀的物件, 複製出來的新物件即成為可對其屬性修改並用於更新資料庫的修改用物件.
而修改用的物件, 也是一種特殊的, 被簡化的條件物件, 它意味著會以各個被修改的屬性等於其屬性值的操作條件. |