對於乙個
orm方案時,為了提供使用者對具體對映方案的細顆粒度的控制的可能,特別對於企業級應用,應該是使用者選擇是否使用該產品比較重要的因素之一,需要盡可能多的實現各種可選的常用對映方案,本文的目的就是對
中物件關係對映方面的解決方案作乙個彙總,當設計或評價乙個
orm方案的時候,也可以相應的以此作為參考。
1、
繼承
說明:對於比較完善的繼承關係一般會有如下共有特點:首先,只允許乙個非介面型別的父類(雖然有的程式語言支援從多個這樣的父類繼承,但一般不被推薦),同時允許多個介面型別的父類;其次,父類有可能為抽象類(即不能例項化,而只能被繼承)。
方案:一般,既然介面或抽象類不能被例項化,自然也不需持久化,因此,對映中只需考慮能夠例項化,也即能夠持久化的實體類,對於這些實體類,具體的常用對映方案有三:
1)每個繼承體系用一張表儲存,該錶包含整個繼承體系中所有類的屬性集合,並且每行包含乙個額外的、用以識別該行代表的被持久化的實體類型別的列;
2)每個實體類對映到一張表,並且,每個子類對應的表重複包含其所有層級的父類的屬性,屬於乙個繼承體系中的每張表包含相同的主鍵值以表示同一例項,並且此時,你有兩種選擇:一、當向子類對應的表插入一條記錄的同時,需要向其所有層級的父類插入記錄,以維持該繼承語意,這樣當取子類資料時,不需鏈結其父類對應的表,二、當向子類對應的表插入一條記錄的同時,不向其所有層級的父類插入記錄,但是,在取乙個類的資料時,需要鏈結其所有的子類對應的表,以取得所有語意上屬於該型別的資料,一般,對於可以選擇用乙個專用的繼承關係查詢表來儲存所有的繼承關係;
3)每個實體類對映到一張表,但是,每個子類對應的表不重複包含其所有層級的父類的屬性,而是,只保證屬於乙個繼承體系中的每張表包含相同的主鍵值以表示同一例項,這時,子類的主鍵,同時也是對應到其父類的表的外來鍵,當需要取得子類資料時,需要鏈結其所有層級的父類對應的表,好處是可以減少方案二中的資料或表結構的冗餘,但是,此時,需要在取子類資料時鏈結子類的所有父類對應的表,一般,可以選擇用乙個專用的繼承關係查詢表來儲存所有的繼承關係。
2、
一對一關聯、一對多關聯(包含一對一和一對多的自關聯)
說明:所謂一對一關聯,實際上還可以分為三種情形,即
0..1 - 1
,1 – 1
,1 – 0..1
三種情形;而一對多關聯則分為
* - 1
和1 - *
。方案:
1)最常用的方案為為需要其他物件引用的類對應的表增加乙個到被引用物件對應表的外來鍵即可,只不過,與表對應的實體類**中,對於一對多情形下的「多」這一端,需定義成集合型別;
2)第二種是在
hibernate
提出的所謂「元件(
component
)對映」,舉例來說,假如
person
類包含乙個
address
成員型別的屬性,而
address
由city
,street
,zipcode
三個成員屬性組成,假如
address
除了與person
關聯不被其他物件使用,則我們可以考慮只用一張資料表
person
來持久化
person
和address
這兩張表,
person
資料表包含
person
類中除address
的屬性和
address
類中的所有屬性的集合,當然,這時需要在元資料中特別指明對映關係;
3)還有一種針對上面的方案中的
person
,address
兩個類的持久化方案則是將
address
型別的所有屬性先序列化,再存入
person
表的字段
address
中,這樣也可以只用一張表來持久化兩個類,當然,本方案中這種被序列化物件成員資料量應盡量小;
4) 在
hibernate
中還提到了一種共享同一主鍵值的一對一關聯。實際上,這種對映方實感覺只用於一種比較特殊的情形,就是,將原本可以同屬於乙個表中相對使用不太頻繁的字段提出來放在另一張表中,這樣,這兩張表的記錄就可以通過乙個相同的主鍵進行關聯,更多說明見
hibernate
的文件。
3、
多對多關聯(包含多對多的自關聯)
說明:所謂多對多關聯自然就是
* - *
這種情形了。
方案:對於多對多關聯的實現一般有兩種可選方案:
1)類似一對多情形中的最常用方案,為關聯的雙方增加到對方的外來鍵,該方案的好處是取資料時不需鏈結操作,只要讀一張表就行,操作比較簡單,缺點是會造成資料冗餘;
2)新增一張包含關聯雙方主鍵的關聯表,這時,在取資料時,需要鏈結該關聯表和資料表,優點是沒有資料冗餘,缺點是帶來了一定的時限複雜度。
//文章結束
O R Mapping中物件關係對映解決方案彙總
對於乙個 orm方案時,為了提供使用者對具體對映方案的細顆粒度的控制的可能,特別對於企業級應用,應該是使用者選擇是否使用該產品比較重要的因素之一,需要盡可能多的實現各種可選的常用對映方案,本文的目的就是對 中物件關係對映方面的解決方案作乙個彙總,當設計或評價乙個 orm方案的時候,也可以相應的以此作...
mybatis中resultMap巢狀對映例項
public class wastedetail implements serializablepublic class wastesuname 注意,返回結果集中巢狀 list 注意 關聯查詢,用pagehel分頁會導致分頁資料不正確。按住表分頁的話,從表的資料將會為空。使用where條件,將分頁...
物件導向中多個物件之間的關係
當談到物件導向的設計時,我們經常說物件導向是符合人們對現實世界的思維模式,即人們採用針對非程式設計領域存在的複雜問題的解決方式,來解決軟體設計過程中各種錯綜複雜的關係。利用物件導向設計,特別是採用各種設計模式來解決問題時,會設計多個類,然後建立多個物件,這些物件,有些主要是資料模型,有些則是行為描述...