二、关系映射
1.关联映射
2.继承映射
3.复合主键映射
复合(联合)主键映射:
通常做法是将主键相关字段放到一个单独的类中,这样类是有要求的:
*必须实现序列化接口
*覆盖equals和hashcode方法
(主键,建议使用没有业务语义的,减少业务变更时的修改)
<class name="com.ys.hibernate.FiscalYearPeriod" table="t_fiscal_year_period">
<composite-id name="fiscalYearPeriodPK">
<key-property name="fiscalYear" />
<key-property name="fiscalPeriod" />
</composite-id>
<property name="beginDate" type="date" />
<property name="endDate" type="date" />
<property name="periodSts" />
</class>
4.组件映射
Component映射
在hibernate中Component映射采用<component>标签即可
Component是某个实体的逻辑组成部分,它与实体类的主要差别在于,它没有oid(对象标识)
Component在DDD(领域驱动设计)中称为值类
采用Component的好处:
实现了对象模型的细粒度划分,复用率高,含义明确,层次分明
对象模型与关系模型的设计恰恰相反,对象模型一般是细粒度的,关系模型一般是粗粒度的
<class name="com.ys.hibernate.Employee" table="t_employee">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<component name="employeeContact">
<property name="email" />
<property name="addrss" />
<property name="zipCode" />
<property name="contactTel" />
</component>
</class>
5.集合映射
完成set/ list/ array/ map的映射
<class name="com.ys.hibernate.CollectionMapping" table="t_collection_mapping">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<set name="setValues" table="t_set_values">
<key column="set_id" />
<element type="string" column="set_value" not-null="true"/>--生成主键
<!--
<composite-element class=""></composite-element>
-->
</set>
<list name="listValues" table="t_list_values">
<key column="list_id" />
<list-index column="list_index" base="100" />
<element type="string" column="list_value" />
</list>
<array name="arrayValus" table="t_array_valus">
<key column="array_id" />
<list-index column="array_index" />
<element type="string" column="array_value" />
</array>
<map name="mapValues" table="t_map_values">
<key column="map_id" />
<map-key type="string" column="map_key" />
<element type="string" column="map_value" />
</map>
</class>
6.其他
(1)关于 cascade(级联)属性
级联的意思是指定两个对象之间的操作联动关系,对一个对象执行了操作之后,对其指定的级联对象也需要执行相同的操作。
总共可以取值为:all、none、save-update、delete
all-代表在所有的情况下都执行级联操作
none-在所有情况下都不执行级联操作
save-update-在保存和更新的时候执行级联操作
delete-在删除的时候执行级联操作
掌握级联的含义
*级联是对象之间的连锁操作,它只影响添加/删除/修改
<many-to-one name="group" column="groupId" cascade="save-update" />
(2)关于lazy属性
hibernate的lazy策略
可以使用在:
*<class>标签上,可以取值:true/false
*<property>标签上,可以取值:true/false,需要类增强工具,对字节码进行修改
*<set>/<list>标签上,可以取值:true/false/extra
*<many-to-one>/<one-to-one>单端关联标签上,可以取值:false/proxy/noproxy
lazy的概念:
在真正使用某个对象的时候才真正的去创建,对于hibernate才会真正的发出sql语句去加载该对象
hibernate的lazy策略必须在session打开状态下有效
<class>上的lazy只影响普通属性
lazy策略在集合上可以取值:true/false/extra
<class>标签上的lazy不会影响集合上的lazy特性,<class>上的lazy只会影响普通属性
hibernate在单端关联上的lazy特性
<many-to-one>/<one-to-one>单端关联标签上,可以取值:false/proxy/noproxy
<class>标签上的lazy不会影响单端关联对象的lazy策略
(3)关于inverse属性:
*可以用在一对多和多对多双向关联上
*默认为false,表示本端可以维护关系;
如果为true,则本端不能维护关系,会交给另一端维护关系,本端失效.
所以一对多关联映射我们通常在多的一端维护关系,让一的一端失效,所以设置inverse为true
<set name="students" inverse="true" >
<key column="classesId" />
<one-to-many class="com.ys.hibernate.Student" />
</set>
inverse和cascade属性
*inverse是控制方向上的反转,只影响存储
*cascade是操作上的连锁反应
本文深入探讨了ORM技术中的六种关系映射方法,包括关联映射、继承映射、复合主键映射、组件映射、集合映射以及其他高级配置如级联、延迟加载等。通过具体的XML配置示例,帮助读者理解如何在Hibernate框架中实现这些映射。

502

被折叠的 条评论
为什么被折叠?



