ProductReleaseID
SubProductAllowable
ProductID
此外,formula 也能協助從基于當前記錄的特定值向其它表檢索數據。例如:
這將由助于從 currency 表檢索 currency name。正如你所看到的,這樣直接映射可消除許多轉換編碼。 map-key formula 允許 map-key 持有任何可能的值。下列范例(圖 3),我們想讓 Role_roleID 成為對象模型的 map-key(圖 4)。 圖 3. 用戶角色數據 schema 圖 4. 用戶角色對象模型 在前面的數據 schema 中,User 和 Role 由 User_has_Role 通過 many-to-many 關系關聯調用。為了獲取某個 User 所有的指派角色,我們進行如下映射:
Role_RoleID 通常用于連接 many-to-many 元素的欄位值。Hibernate 通常不允許 Role_RoleID 出現在 map-key 和 many-to-many 的欄位屬性中。但是有了 formula,Role_RoleID 也能用于 map-key。 element、map-key-many-to-many 以及其他 element 和 property 類似,能從任何有效的 formula 表達式賦予評估值。 map-key-many-to-many 中 formula 的用法類似于 map-key。但是,map-key-many-to-many 通常用于三重關系,map key 是一個被自己參考的對象,而不是被參考的屬性。 那么,到底哪些情況下 formula 不支持呢?有些數據庫(例如 Oracle 7)就不支持嵌入式 select 語句(也就是說一條 select SQL 內嵌在另外一條 select SQL 語句中),這種情況 formula 就不支持評估結果。因此,你應該首先檢查嵌入式 select SQL 語句是否被支持。 一旦 Hibernate 的映射拿 formula 表達式作為 select SQL 選取的一部分,請確認數據庫 SQL 方言是否允許使用 formula,盡管這樣將降低代碼輕便性。 范疇 2:formula 用于連接
many-to-one 另一個普遍的場景是真實世界的數據模型是所有者關系映射,這意味著映射是不同于 one-to-one、one-to-many 以及 many-to-many 關系的,formula 是提供所有者關系管理元素中的一個。圖 5 展示了某公司可有多個聯系人,但是其中只有一個為默認聯系人的范例。一個公司有多個聯系人是典型的 one-to-many 關系。但是,為了標識默認聯系人,ContactPerson 表使用了 defaultFlag 參數(1 是 yes, 0是 no)。 圖 5. 用戶角色數據 schema 圖 6. 用戶角色對象模型 為了說明對象模型(圖 6)中默認聯系人關系,我們使用如下映射文件:
如上,我們把 companyID 和 defaultFlag 組織到名為 defaultContactPerson 的 properties 元素中,做為 Person 表的 unique key。Company 類中的 many-to-one 元素連接 Person 表的 defaultContactPerson properties 元素。輸出的 SQL 像這樣: select c.id, p.id from Company c, Person p where p.companyID=c.id and p.defaultFlag=1 one-to-one Hibernate 中,one-to-one 主要用于兩張表共享同一主鍵的情況。對于外鍵關聯,我們通常使用 many-to-one 來代替。但是,有了 formula,one-to-one 可以通過外鍵連接表。上面的 many-to-one 范例可以通過 one-to-one 來映射:
many-to-many formula 用于當 many-to-many 元素為關系表和實體表連接的特殊關系,盡管通常沒有必要這樣用。 總結
文章范例展示了大部分 formula 的適用情景。當需要 formula 評估值時,formula 表達式將出現在 產生的 SQL 語句的 select 部分。當 formula 用于連接時,它出現在產生的 SQL 語句的 where 部分。此外,formula 表達式可用于任何 SQL 方言,只要目標數據庫支持。最后,formula 可協助完成從數據模型到對象模型的無代碼細粒度映射。 請注意!引用、轉貼本文應注明原譯者:Rosen Jiang 以及出處:http://www.tkk7.com/rosen