一对一关联映射

一对一主键关联映射

   一句话:不加字段。主键既是主键又是外键。

一对一单向主键关联映射

配置:

<span style="font-family:KaiTi_GB2312;font-size:18px;"><id name="id">
<!-- 採用foreign生成策略。forgeign会取得关联对象的标识 -->
<generator class="foreign">
<!-- property仅仅关联对象 -->
<param name="property">idCard</param> //參数为实体中的属性名称
</generator>
</id> <one-to-one name="idCard" constrained="true"/> //name:实体中的属性名称;constrained="true”:设置当前主键还是一个外键,參照了对端的主键(IdCard的主键)</span>

一对一双向主键关联映射

   单向变成双向,仅仅须要在还有一端实体中也加入关联属性和还有一端配置文件里加入

<span style="font-family:KaiTi_GB2312;font-size:18px;"><one-to-one name=”person”/> //name:实体中的属性名称</span>

一对一唯一外键关联映射

   一句话:加入一个外键字段,是还有一个的主键。

一对一单向唯一外键关联映射

配置和多对一一样,仅仅是在配置中加入一个唯一限制条件,这样就实现了加入外键字段和一对一关联映射了。

<many-to-one name=”idCard”
unique=”true”>      

 

一对一双向唯一外键关联映射

单向变成双向,仅仅须要在还有一端实体中也加入关联属性和还有一端配置文件里加入

<span style="font-family:KaiTi_GB2312;font-size:18px;"><one-to-one name=”person” property-ref=”idCard”>    // property-ref:指定关系字段的名称</span>

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

一对多关联映射

   一句话:和多对一的表结构和映射原理一样,都是在多端加入外键是一的主键。

一对多单向关联映射

   关系维护在“一”一端(以后简称“一端”和“多端”)

在一端配置:

<span style="font-family:KaiTi_GB2312;font-size:18px;"><set name="students">

                      <key column="classesid"/> //字段名称,且此处不能设置not-null="true"

                     <one-to-many class="com.bjpowernode.hibernate.Student"/>             //多端实体完整路径

              </set></span>

 

一对多双向关联映射

关系维护在多端

单向变成双向

一端配置:在一端设置inverse="true"就不维护关系了,交给多端维护

<span style="font-family:KaiTi_GB2312;font-size:18px;"><set name="students" inverse="true">

                      <key column="classesid"/> //key标签:在多端加入外键

                     <one-to-many class="com.bjpowernode.hibernate.Student"/>

              </set></span>

多端配置:

<span style="font-family:KaiTi_GB2312;font-size:18px;"><many-to-one name="classes" column="classesid"/>    //<key>和<many-to-one>标签加入的字段保持一致,否则会产生数据混乱</span>

多对一关联映射

   一句话:在多端加入外键是一的主键

方向:从多能看到一,一看不到多

关系维护:在多端。多端实体中加入关联属性

配置:在多的一端配置。用<many-to-one>标签,设置cascade(级联)能够将关联对象一起保存。

<span style="font-family:KaiTi_GB2312;font-size:18px;"><many-to-one name="group" column="groupid" cascade="save-update"/>  //name:实体中的属性名称,column:数据库中加入字段的名称。

</span>

具体解释:

cascade(级联):指定两个对象之间的操作联动关系,对一个对象运行操作后,对其指定的级联对象也须要运行同样的操作。

取值:

all:代表在全部的情况下都运行级联操作

none:在全部的情况下都不运行级联操作

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

delete:在删除的时候运行级联操作

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

多对多关联映射

   一句话:用第三方表维护关系

多对多单向关联映射

配置:

<span style="font-family:KaiTi_GB2312;font-size:18px;"><set name="roles" table="t_user_role">    //加入表

                     <key column="user_id"  not-null="true" />    //表中加入字段,此列即作为主键又作为外键。必须不能为空,字段名:user_id

                     <many-to-many class="com.bjpowernode.hibernate.Role" column="role_id" />            //加入字段role_id

              </set></span>

多对多双向关联映射

   单向变双向,仅仅须要在还有一端也加上实体关系和配置关联映射,且配置的表名和字段名都必须同样。

配置:

<span style="font-family:KaiTi_GB2312;font-size:18px;"><set name="users" table="t_user_role">    //表名

                     <key column="role_id" not-null="true"/>//字段名:role_id

                     <many-to-many class="com.bjpowernode.hibernate.User" column="user_id"/>     //字段名:user_id

              </set></span>

继承映射

每颗类继承树使用一个表

   一句话:全部的对象放到一张表中,须要加入鉴别字段

  
长处:一张表。查询效率高

   缺点:easy出现冗余

配置(在父类中配置):

<span style="font-family:KaiTi_GB2312;font-size:18px;"><discriminator column="type" type="string"/>       //加入鉴别字段

              <subclass name="Pig" discriminator-value="P">     // subclass:定义子类标签,扩展映射,加入对应的鉴别值(discriminator-value);name:为子类的全路径名(若外面已经设置路径。则仅仅须要填写类名)

                     <property name="weight"/>

              </subclass>

              <subclass name="Bird" discriminator-value="B">

                     <property name="height"/>

              </subclass></span>

每个类一个表

   一句话:主键既是主键也是外键

  
长处:层次清楚

   缺点:当关联多了的时候,会影响效率

配置:

<span style="font-family:KaiTi_GB2312;font-size:18px;"><joined-subclass name="Pig" table="t_pig">    //加入表

                     <key column="pid"/>     //表中加入字段,作为主键也作为外键。指向父表的主键

                     <property name="weight"/>

              </joined-subclass>

              <joined-subclass name="Bird" table="t_bird">

                     <key column="bid"/>

                     <property name="height"/>

              </joined-subclass></span>

每一个具体类一个表

   缺点:不能使用自增主键

配置:

<span style="font-family:KaiTi_GB2312;font-size:18px;"><class name="Animal" table="t_animal" abstract="true">   // animal类设置成抽象的就不会生成出此表。

<id name="id">

                     <generator class="assigned"/>      //assigned让程序在save之前为对象分配一个标识符,不自己主动生成主键

              </id>

              <property name="name"/>

              <property name="sex"/>

              <union-subclass name="Pig" table="t_pig">

                     <property name="weight"/>

              </union-subclass>

              <union-subclass name="Bird" table="t_bird">

                     <property name="height"/>

              </union-subclass>

       </class></span>

其它映射:

复合主键映射

   加入一个主键实体类,实现序列化(Serializable)接口,重写equals和hashCode方法

配置(主要是复合主键的配置):

<span style="font-family:KaiTi_GB2312;font-size:18px;"><composite-id name="fiscalYearPeriodPK">   

                     <key-property name="fiscalYear"/>

                     <key-property name="fiscalPeriod"/>

              </composite-id></span>

component映射

   一句话:将公共的一些属性放到一个实体中,但这个实体不生成表。用关联联系起来。(三个实体。两张表)

   长处:实现对象模型的细粒度划分,复用率更高。含义明白,层次分明

配置:

<span style="font-family:KaiTi_GB2312;font-size:18px;"><component name="userContact">     // component是某个实体的逻辑组成部分,它与实体类的主要区别在于,它没有oid。

                     <property name="email"/>

                     <property name="address"/>

                     <property name="zipCode"/>

                     <property name="contactTel"/>

              </component></span>

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

集合映射

   一句话:一个实体。实体中的每一个集合都是一张表

配置:

   set集合使用set标签。加入表,加上主键(即外键),普通字段使用element。存储类使用composite-element。

<span style="font-family:KaiTi_GB2312;font-size:18px;"><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></span>

   list集合使用list标签。加入表,加上主键(即外键)。普通字段使用element,存储索引:list-index,base表示索引开头值。

<span style="font-family:KaiTi_GB2312;font-size:18px;"><list name="listValues" table="t_list_values">

                     <key column="list_id"/>

                     <list-index column="list_index"/>

                     <element type="string" column="list_value"/>

              </list></span>

   Array集合使用array标签。加入表,加上主键(即外键)。普通字段使用element,存储索引:list-index。

<span style="font-family:KaiTi_GB2312;font-size:18px;"><array name="arrayValues" table="t_array_values">

                      <key column="array_id"/>

                      <list-index column="array_index"/>

                      <element type="string" column="array_value"/>

              </array></span>

   Map集合使用map标签,加入表。加上主键(即外键)。key值使用map-key标签,value值使用element标签

<span style="font-family:KaiTi_GB2312;font-size:18px;"><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></span>

总结

  1. 维护关系端在哪就在哪端实体中加入关联属性(单向关联映射),若两端都维护关系(双向关联映射),则两方实体中都加入关联属性。

    若加入的关联属性为多端,则使用集合。

  2. column:填写字段名称

   3、many-to-one和one-to-one:many-to-one会影响数据库的表结构(加入字段)。且要维护字段值;one-to-one不维护字段值,仅仅维护载入。

   4、使用关联映射。载入对象,就能够将其关联对象也载入出来,就不须要再使用sql语句进行查询了。

【SSH】Hibernate关联映射的更多相关文章

  1. Hibernate关联映射关系

    Hibernate关联映射关系 一.双向一对多关联映射关系:当类与类之间建立了关联,就可以方便的从一个对象导航到另一个或另一组与它关联的对象(一对多双向关联和多对一双向关联是完全一样的) 1.1创建实 ...

  2. Oracle primary,unique,foreign 区别,Hibernate 关联映射

    Oracle primary,unique,foreign 区别 转:http://www.cnblogs.com/henw/archive/2012/08/15/2639510.html NOT N ...

  3. 第六章 Hibernate关联映射

    第六章 hibernate关联映射一.本章知识点分为2部分:1.关联关系:单向多对一关联关系,双向一对多关联关系(含一对多关联关系),多对多关联关系2.延迟加载:类级别加载策略,一对多加载策略,多对一 ...

  4. 【学习笔记】Hibernate关联映射(Y2-1-6)

    Hibernate关联映射 关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用. 1.单向多对一关联 准备数据库 部门表和员工表 其中部门表有两列 部门编号和名称 员工表有三列 员工 ...

  5. 第三章Hibernate关联映射

    第三章Hibernate关联映射 一.关联关系 类与类之间最普通的关系就是关联关系,而且关联是有方向的. 以部门和员工为列,一个部门下有多个员工,而一个员工只能属于一个部门,从员工到部门就是多对一关联 ...

  6. (转)Hibernate关联映射——对象的三种关系

    http://blog.csdn.net/yerenyuan_pku/article/details/70148618 Hibernate关联映射——对象的三种关系 Hibernate框架基于ORM设 ...

  7. (转)Hibernate关联映射——一对多(多对一)

    http://blog.csdn.net/yerenyuan_pku/article/details/70152173 Hibernate关联映射——一对多(多对一) 我们以客户(Customer)与 ...

  8. Hibernate关联映射(一对多/多对多)

    版权声明:翀版 https://blog.csdn.net/biggerchong/article/details/843401053.  Hibernate关联映射上接Hibernate持久化类:h ...

  9. Java三大框架之——Hibernate关联映射与级联操作

    什么是Hibernate中的关联映射? 简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射. 它将数据库中的表映射成对应的 ...

随机推荐

  1. [转]什么是 RPC?

    知乎上看到的一个解释,解释的太精炼太直接,忍不住在这记录一下. 知乎地址:https://www.zhihu.com/question/25536695 本地过程调用 RPC就是要像调用本地的函数一样 ...

  2. Python学习笔记三:模块

    一:模块 一个模块就是一个py文件,里面定义了一些业务函数.引用模块,可以用import语句导入.导入模块后,通过 模块.函数名(参数)  来使用模块中的函数.如果存在多个同名模块,则前面模块名需要加 ...

  3. postgresql修改配置生效方法

    对于配置服务器,,太多时候我们在Linux中做的操作是,配置*.conf文件,然后重启服务.而很多服务都具有reload功能,而但是具体到某个配置,有时候直接说出需不需要重启服务而使得配置生效,这并不 ...

  4. cocos2d-js 自定义事件监听派发

    熟悉js的dom事件或者flash事件的,基本都能立马明白cc.eventManager的用法. cc.eventManager有两种注册监听器的方式,一种是原生事件,例如 cc.eventManag ...

  5. ArcGIS调整影像颜色输出

    有碰到一些质量很差的遥感影像,颜色需要进行调整(主要是针对看)输出,这里记录一下ArcGIS中的调整输出方式. 1.首先把影像文件拖入ArcMap中,然后右键单击图层列表中的图像,选择属性. 2.选择 ...

  6. Jenkins+Ant+Jmeter搭建持续集成的接口测试平台(转)

    一.什么是接口测试? 接口测试是测试系统组件间接口的一种测试.接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点.测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻 ...

  7. Fix problems that block programs from being installed or removed

    Follow these steps to automatically repair issues including corrupted registry keys that block you f ...

  8. Spring 3整合Quartz 2实现定时任务三:动态暂停 恢复 修改和删除任务

    前面我们已经完成了spring 3和quartz 2的整合以及动态添加定时任务,我们接着来完善它,使之能支持更多的操作,例如暂停.恢复.修改等. 在动态添加定时任务中其实已经涉及到了其中的一些代码,这 ...

  9. Android 百度鹰眼轨迹SDK(v2.1.6)

    闲聊 看过<鹰眼追击>这部电影的读者一定对"鹰眼"这台巨无霸计算机印象深刻,如今我们能够实现自己的鹰眼. 效果图 本篇为百度地图SDK第三篇博文 第一篇实现:Andro ...

  10. ajax done和always区别

    jQuery中Ajax有done和always这两个回调方法:done:成功时执行,异常时不会执行.always:不论成功与否都会执行.