Hibernate 映射

29 篇文章 1 订阅

映射分为关联映射、继承映射、复合主键映射、Component映射、集合映射

1.关联映射

参考文章:
Hibernate 一对一 关联关系映射
Hibernate 一对多 关联关系映射
Hibernate 多对一 关联关系映射
Hibernate 多对多 关联关系映射

2.继承映射

继承映射分为三种:一棵树一张表;一个类一张表;一个具体类一张表

@1. 一棵树一张表

实现

  • 需要添加鉴别值,鉴别字段必须紧跟<id>标签后,用来区分子类(鉴别值在存储时hibernate会自动存储,在加载的时候会根据鉴别值取得相关的对象)
  • 使用<subclass>标签添加子类

映射文件配置如下

<hibernate-mapping  package="com.bjpowernode.hibernate">
    <class name="Animal" table ="t_animal" lazy="true">
        <id name="id">
            <generator class="native" />
        </id>

        <discriminator column="type" type="string" />
        <property  name="name" />
        <property  name="sex" />
        <!--子类标签,设置鉴别值-->
        <subclass name="Pig" discriminator-value="P" >
            <property name="weight" />
        </subclass>
        <subclass name="Bird" discriminator-value="B">
            <property name="height" />
        </subclass>
    </class>
</hibernate-mapping>

说明:

  • 优点:简单
  • 缺点:存在冗余字段
  • 通过父类,找子类,虽然是根据id查找的,但实际是通过鉴别值自动转换为子类的

@2. 一个类一张表

实现:

  • 使用<joined-subclass>标签产生关系
  • 需要设置子类映射表的主键

映射文件如下:

<class name="Animal" table ="t_animal" lazy="true">
        <id name="id">
            <generator class="native" />
        </id>   
        <property  name="name" />
        <property  name="sex" />
        <joined-subclass name="Pig" table="t_pig">
            <key column="pid"></key>
            <property name="weight" />
        </joined-subclass>
        <joined-subclass name="Bird" table="t_bird">
            <key column="bid"></key>
            <property name="height" />
        </joined-subclass>
    </class>

说明:

  • 优点:表简单
  • 缺点:当继承多时,查询关联的表多,效率不好
  • 子类自动继承父类的属性,跟类的继承一样,子类自动就拥有父类的属性了

@3.一个具体类一张表

实现:

  • 使用<union-subclass>标签
  • 标签添加abstract="true"属性

配置文件如下:

    <class name="Animal"  abstract="true">
        <id name="id">
            <!--因为不支持自增-->
            <generator class="assigned" />
        </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>

说明:

  • 缺点:不支持自增
  • 注意:Animal类不会生成表的,只有具体类才会生成表

三种策略,建议使用第一种,层次不多时,也可用第二种

3. 复合主键映射

实现:

  • 使用<composite-id>标签,用来添加符合主键

映射文件如下:

    <class name="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"/>
    </class>

说明:

  • 加载或保存时,操作的主键实体类,因为主键类型为实体类,但数据库实际生成的表是复合主键类的属性字段

4.Component映射

实现:

  • 使用<component>标签

映射文件如下:

<class name="Employee" table ="t_employee">
        <id name="id">
            <generator class="native" />
        </id>
        <property name="name" />
        <component name="employContact">
            <property name="email" />
            <property name="address" />
            <property name="zipCode" />
            <property name="contactTel" />
        </component> 
    </class>

说明:

  • 使用情况:当多个类有相同属性时,就不用每个类都重复写一遍了


5. 集合映射

实现:

  • 使用集合标签

映射文件如下

    <class name="CollectionMapping" table ="t_collection">
        <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></composite-element> -->
        </set>
        <!--存储有序-->
        <list name="listValues" table="t_list_values">
            <key column="list_id" />
            <list-index column="list_index" />
            <element type="string" column="list_value" />
        </list>
        <!--存储有序-->
        <array name="arrayValues" table="t_array_values">
            <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>

说明:

  • 每个集合是一张表
  • 主表中只有主键和普通属性
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值