欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hibernate 映射

程序员文章站 2022-04-16 22:42:37
...

映射分为关联映射、继承映射、复合主键映射、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>

说明:

  • 每个集合是一张表
  • 主表中只有主键和普通属性