我們學習component映射首先要了解它的一些特性。組件(component)屬性的意思是:持久化類的屬性並不是基本
數據類型,也不是字符串、日期等類型的變量,而是一個被包含的對象,在持久化的過程中,它僅僅被當做值類型,
而並非一個實體引用。在DDD中被稱爲值類,與實體類的區別就是沒有標識。
屬性介紹:
在hibernate中Component映射採用<component>標籤即可,主要屬性有:
(1)name:用於指定該組件屬性的名稱。
(2)class:指定組件類的類名。如果不指定該屬性,Hibernate將通過反射來得到該組件的類型。
(3)insert:指定被映射的字段是否出現在SQL的insert語句中。
(4)update:指定被映射的字段是否出現在SQL的update語句中。
(5)access:指定Hibernate訪問該組件屬性的訪問策略。
(6)lazy:設置該組件是否在持久化對象第一次被訪問時啓用延遲加載,該屬性默認是true。
(7)optimistic-lock:設置更新該組件屬性是否需要獲取樂觀鎖,如果該屬性設置爲true,則當修改該組件屬性
時,持久化對象的版本號會增加。
示例:
對象模型:
關係模型:
映射文件:
Employee.hbm.xml
<span style="font-size:18px;"><hibernate-mapping>
<class name="com.wyj.hibernate.Employee" table="t_emplyee">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<component name="employeeContact">
<property name="email"/>
<property name="address"/>
<property name="zipCode"/>
<property name="contactTel"/>
</component>
</class>
</hibernate-mapping> </span>
User.hbm.xml
<span style="font-size:18px;"><hibernate-mapping>
<class name="com.wyj.hibernate.User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<component name="userContact">
<property name="email"/>
<property name="address"/>
<property name="zipCode"/>
<property name="contactTel"/>
</component>
</class>
</hibernate-mapping> </span>
Component的優點:
實現對象模型的細粒度劃分,複用率高,含義明確,層次分明。對象模型與關係模型的設計恰恰相
反,對象模型一般是細粒度的,關係模型一般是粗粒度的。
總結:
我們可以發現components映射中,對象和數據表並不是一一對應的,對象的設計粒度要比數據表更細。通過輔助
對象,簡化程序中的操作,而表結構卻並沒有發生變化。也就是通過component映射,我們可以在不增加表的複雜度
的情況下,簡化程序的設計。