Hibernate关系映射

本文深入探讨了ORM技术中的六种关系映射方法,包括关联映射、继承映射、复合主键映射、组件映射、集合映射以及其他高级配置如级联、延迟加载等。通过具体的XML配置示例,帮助读者理解如何在Hibernate框架中实现这些映射。

二、关系映射

1.关联映射

2.继承映射

3.复合主键映射

         复合(联合)主键映射:

         通常做法是将主键相关字段放到一个单独的类中,这样类是有要求的:

                   *必须实现序列化接口

                   *覆盖equalshashcode方法

         (主键,建议使用没有业务语义的,减少业务变更时的修改)

	<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映射

         hibernateComponent映射采用<component>标签即可

         Component是某个实体的逻辑组成部分,它与实体类的主要差别在于,它没有oid(对象标识)

         ComponentDDD(领域驱动设计)中称为值类

         采用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(级联)属性

          级联的意思是指定两个对象之间的操作联动关系,对一个对象执行了操作之后,对其指定的级联对象也需要执行相同的操作。

         总共可以取值为:allnonesave-updatedelete

                   all-代表在所有的情况下都执行级联操作

                   none-在所有情况下都不执行级联操作

                   save-update-在保存和更新的时候执行级联操作

                   delete-在删除的时候执行级联操作

         掌握级联的含义

         *级联是对象之间的连锁操作,它只影响添加/删除/修改

	<many-to-one name="group" column="groupId" cascade="save-update" />
      (2)关于lazy属性

hibernatelazy策略

可以使用在:

         *<class>标签上,可以取值:true/false

         *<property>标签上,可以取值:true/false,需要类增强工具,对字节码进行修改

         *<set>/<list>标签上,可以取值:true/false/extra

         *<many-to-one>/<one-to-one>单端关联标签上,可以取值:false/proxy/noproxy       

lazy的概念:

         在真正使用某个对象的时候才真正的去创建,对于hibernate才会真正的发出sql语句去加载该对象       

hibernatelazy策略必须在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,则本端不能维护关系,会交给另一端维护关系,本端失效.     

         所以一对多关联映射我们通常在多的一端维护关系,让一的一端失效,所以设置inversetrue

		<set name="students" inverse="true" >
		    <key column="classesId" />
		    <one-to-many class="com.ys.hibernate.Student" />
		</set>   

inversecascade属性

         *inverse是控制方向上的反转,只影响存储

         *cascade是操作上的连锁反应

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值