我们学习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映射,我们可以在不增加表的复杂度
的情况下,简化程序的设计。