對象的存儲和關(guān)系型數(shù)據(jù)庫
ORM 的原則是將一個類映射到一張表上,然而對象和關(guān)系型數(shù)據(jù)庫之間有一點的差異。
對象和對象之間的關(guān)系有一對一,一對多,多對多。這三個關(guān)系的關(guān)系的存儲是有差異的。
1、一對一:我們可以用兩張表分別表示兩個類。他們之間的關(guān)系我們可以用主關(guān)鍵字或者外關(guān)鍵字來表示。然而這里有一個粒度的問題(The problem of granularity )。關(guān)于粒度問題見第4點。
2、一對多:我們也可以用兩張表來表示兩個類。他們的關(guān)系我們可以用外鍵來關(guān)聯(lián)。
3、多對多:我們可以用兩張表來表示這兩個類。用第三張表來表示他們之間的關(guān)系。
4、關(guān)于問題的粒度:
??????如:一個用戶和一個地址之間的關(guān)系。當(dāng)然我們可以用一對一的方法來解決。
然而這樣是否合理?也許最好的方法是在數(shù)據(jù)庫中增加一個新的數(shù)據(jù)類型Address(country state city zipcode etc.)。這樣我們就很容易把這個粒度問題解決了。不幸的是,數(shù)據(jù)庫是不允許自定義類型的(也許現(xiàn)在的數(shù)據(jù)庫可以,鄙人不太清楚,呵呵)。Hibernate 對這個問題有了很好的解決。見以后的文章。
5、對象之間可以有繼承的關(guān)系,這是數(shù)據(jù)庫望洋興嘆的。Hibernate 對這個問題有了很好的解決。見以后的文章。
6、對象的身份識別問題。
??? 大家都知道,java中的對象識別是用equals()和haseCode()來實現(xiàn)。
???舉例:























































































這樣的類由于沒有實現(xiàn)equals()和haseCode(),所以如果用下面的代碼我們可以看到如下輸出:







但是我們加上如下代碼:




















這就是java的對象識別。如果你將修改后的Message對象加入到j(luò)ava.util.Set中,不管你加多少,最后size()仍然為1。
?那么hibernate中的對象識別如何呢?見以后文章。呵呵。
?
posted on 2007-02-10 14:44 滿山紅葉 閱讀(653) 評論(0) 編輯 收藏 所屬分類: Hibernate學(xué)習(xí)筆記