標籤:c style class blog code java
一、使用組成關係的原則:
在不導致資料冗餘的前提下,儘可能減少資料庫表的數目及表之間的外鍵參照關係,因為建立多個表的串連是很耗時的操作。
舉例說明:Customer類中的Address屬性,可以通過組件的方式來映射,避免了額外建立一張ADDRESS表,還能達到對象化操作的目的。
設定檔:
?
| 1 2 3 4 5 6 7 |
<component name="homeAddress" class="mypack.Address"> <parent name="customer" /> <property name="province" type="string" column="HOME_PROVINCE"/> <property name="city" type="string" column="HOME_CITY"/> <property name="street" type="string" column="HOME_STREET"/> <property name="zipcode" type="string" column="HOME_ZIPCODE"/> </component> |
說明:
?
| 1 2 3 |
name:設定被映射的持久化類的屬性名稱。 class:設定homeAddress屬性的類型。 <parent>:指定Address類所屬的整體類。 |
注意:區分是否存在組成關係。Hibernate組件Address沒有OID。
1、區分 實值型別和實體類型:
Hibernate組件Address沒有OID,因此不能通過Session來單獨儲存、更新、刪除或載入一個Address對象。當使用以下方法時:
?
| 1 2 3 4 |
session.load(Address.class,new Long(1)); session.save(address); session.update(address); session.delete(address); |
會拋出org.hibernate.MappingException:Unknow entity class: xx.xxx.Address。
實值型別沒有OID,不能被單獨持久化,它的生命週期依賴於所屬的持久化類的對象的生命週期。
二、映射複合組成關係:
一個Hibernate組件可以包含其他的Hibernate組件,擷取其他實體類關聯。
設定檔同上,僅是在component中嵌套一個component即可。
三、Hibernate組件總結:以Address為例
1、沒有OID,在資料庫中沒有對應的表。
2、不需要單獨建立Address類的對應檔。
3、不能單獨持久化Address對象。Address對象的生命週期依賴於其整體類對象的生命週期。
4、其他持久化類不允許關聯Address類。
5、Address類可以關聯其他持久化類。
6、在component元素中還可以嵌套component元素,用於映射複合組成關係。