【SSH】Hibernate关联映射

曾经终败给现在 2022-07-27 16:54 265阅读 0赞

一对一关联映射

一对一主键关联映射

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

一对一单向主键关联映射

配置:

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

Center

一对一双向主键关联映射

单向变成双向,只需要在另一端实体中也加入关联属性和另一端配置文件中加入

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

Center 1

一对一唯一外键关联映射

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

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

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

Center 2

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

单向变成双向,只需要在另一端实体中也加入关联属性和另一端配置文件中加入

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

Center 3

一对多关联映射

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

一对多单向关联映射

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

在一端配置:

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"><set name="students">
  2. <key column="classesid"/> //字段名称,且此处不能设置not-null="true"
  3. <one-to-many class="com.bjpowernode.hibernate.Student"/> //多端实体完整路径
  4. </set></span>

Center 4

一对多双向关联映射

关系维护在多端

单向变成双向

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

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"><set name="students" inverse="true">
  2. <key column="classesid"/> //key标签:在多端加入外键
  3. <one-to-many class="com.bjpowernode.hibernate.Student"/>
  4. </set></span>

多端配置:

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

Center 5

多对一关联映射

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

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

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

配置:在多的一端配置,用标签,设置cascade(级联)可以将关联对象一起保存。

  1. <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:在删除的时候执行级联操作

Center 6

多对多关联映射

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

多对多单向关联映射

配置:

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"><set name="roles" table="t_user_role"> //添加表
  2. <key column="user_id" not-null="true" /> //表中添加字段,此列即作为主键又作为外键,必须不能为空,字段名:user_id
  3. <many-to-many class="com.bjpowernode.hibernate.Role" column="role_id" /> //添加字段role_id
  4. </set></span>

Center 7

多对多双向关联映射

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

配置:

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"><set name="users" table="t_user_role"> //表名
  2. <key column="role_id" not-null="true"/>//字段名:role_id
  3. <many-to-many class="com.bjpowernode.hibernate.User" column="user_id"/> //字段名:user_id
  4. </set></span>

Center 8

继承映射

每颗类继承树使用一个表

一句话:所有的对象放到一张表中,需要添加鉴别字段

优点:一张表,查询效率高

缺点:容易出现冗余

配置(在父类中配置):

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"><discriminator column="type" type="string"/> //添加鉴别字段
  2. <subclass name="Pig" discriminator-value="P"> // subclass:定义子类标签,扩展映射,加入相应的鉴别值(discriminator-value);name:为子类的全路径名(若外面已经设置路径,则只需要填写类名)
  3. <property name="weight"/>
  4. </subclass>
  5. <subclass name="Bird" discriminator-value="B">
  6. <property name="height"/>
  7. </subclass></span>

Center 9

每个类一个表

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

优点:层次清楚

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

配置:

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"><joined-subclass name="Pig" table="t_pig"> //添加表
  2. <key column="pid"/> //表中添加字段,作为主键也作为外键,指向父表的主键
  3. <property name="weight"/>
  4. </joined-subclass>
  5. <joined-subclass name="Bird" table="t_bird">
  6. <key column="bid"/>
  7. <property name="height"/>
  8. </joined-subclass></span>

Center 10

每个具体类一个表

缺点:不能使用自增主键

配置:

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"><class name="Animal" table="t_animal" abstract="true"> // animal类设置成抽象的就不会生成出此表。
  2. <id name="id">
  3. <generator class="assigned"/> //assigned让程序在save之前为对象分配一个标识符,不自动生成主键
  4. </id>
  5. <property name="name"/>
  6. <property name="sex"/>
  7. <union-subclass name="Pig" table="t_pig">
  8. <property name="weight"/>
  9. </union-subclass>
  10. <union-subclass name="Bird" table="t_bird">
  11. <property name="height"/>
  12. </union-subclass>
  13. </class></span>

其他映射:

复合主键映射

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

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

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"><composite-id name="fiscalYearPeriodPK">
  2. <key-property name="fiscalYear"/>
  3. <key-property name="fiscalPeriod"/>
  4. </composite-id></span>

component映射

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

优点:实现对象模型的细粒度划分,复用率更高,含义明确,层次分明

配置:

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"><component name="userContact"> // component是某个实体的逻辑组成部分,它与实体类的主要差别在于,它没有oid。
  2. <property name="email"/>
  3. <property name="address"/>
  4. <property name="zipCode"/>
  5. <property name="contactTel"/>
  6. </component></span>

Center 11

集合映射

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

配置:

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

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"><set name="setValues" table="t_set_values">
  2. <key column="set_id"/>
  3. <element type="string" column="set_value" not-null="true"/>
  4. <!--
  5. <composite-element class=""></composite-element>
  6. -->
  7. </set></span>

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

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"><list name="listValues" table="t_list_values">
  2. <key column="list_id"/>
  3. <list-index column="list_index"/>
  4. <element type="string" column="list_value"/>
  5. </list></span>

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

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"><array name="arrayValues" table="t_array_values">
  2. <key column="array_id"/>
  3. <list-index column="array_index"/>
  4. <element type="string" column="array_value"/>
  5. </array></span>

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

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"><map name="mapValues" table="t_map_values">
  2. <key column="map_id"/>
  3. <map-key type="string" column="map_key"/>
  4. <element type="string" column="map_value"/>
  5. </map></span>

Center 12

总结

  1. 维护关系端在哪就在哪端实体中加入关联属性(单向关联映射),若两端都维护关系(双向关联映射),则双方实体中都加入关联属性。若加入的关联属性为多端,则使用集合。
  2. column:填写字段名称

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

    4、使用关联映射,加载对象,就可以将其关联对象也加载出来,就不需要再使用sql语句进行查询了。

发表评论

表情:
评论列表 (有 0 条评论,265人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Hibernate--关联映射

           hibernate是持久层ORM框架,关系映射解决了对象型实体与关系型数据库不相匹配的问题,它是Hibernate的核心内容,在实际操作中我们必须要根据数据表的相

    相关 MyBatis关联映射

    1.一对一 例:人与身份证 一个人只有一个身份证,一个身份证对应一个人。 那么MyBatis如何处理这种关系呢? (1)创建数据库表 创建数据库 mybatis