HIbernate框架基础浅析(四)

本文详细介绍了ORM中三种主要的继承关系映射策略:整个继承树一张表、每个子类一张表及每个具体类一张表,并解释了每种策略的适用场景。此外,还探讨了组件映射与复合主键的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 一、继承关系映射



1. 整个继承树一张表
父类用普通的<class>标签定义。
父类通过<discriminator>标签来指定鉴别器。放置<id>标签的后面
  如:<discriminator column="字段名" type="string"/>
子类使用<subclass>标签(嵌套在<class>标签内)定义:
subclass标签的name属性是子类的全限定名。
在subclass标签中,用discriminator-value属性来标明本子类的discriminator字段的值。
子类的其它属性,像普通类一样,定义在subclass标签的内部。

2. 每个子类一张表
父类用普通的<class>标签定义即可,父类不再需要定义discriminator字段
子类用<joined-subclass>标签定义:
需要包含一个<key>标签,用来指定子类和父类之间是通过哪个字段来关联的:
如:<key column="s_id"/>
子类的其它属性,像普通属性一样,定义在joined-subclass标签的内部。
<class name="com.qiujy.domain.Singer">
 <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <property name="region"/>
        <property name="description"/>
        
        <joined-subclass name="com.qiujy.domain.SingleSinger">
         <key column="single_id"/>
         <property name="gender" column="single_gender"/>
        </joined-subclass>
        
        <joined-subclass name="com.qiujy.domain.Bands">
         <key column="bands_id"/>
         <property name="leader" column="bands_leader"/>
        </joined-subclass>
 </class>

3. 每个具体类一张表
父类用普通<class>标签定义即可。(如果父类为抽象类,可以添加abstract="true"来禁止产生表)
注意:主键生成策略不能使用自增生成主键。可以使用uuid。因为在保存对象的时候id是不能重复的。

子类用<union-subclass>标签定义:
union-subclass标签不再需要包含key标签(与joined-subclass不同)
子类的其它属性,像普通类一样,定义在union-subclass标签的内部。这里只要定义子类的属性,
因为它继承了父类,在映射到数据库表的时候,它会包含上父类的所有属性的映射字段。

<class name="com.qiujy.domain.Singer" abstract="true">
 <id name="id">
            <generator class="uuid"/>
        </id>
        <property name="name"/>
        <property name="region"/>
        <property name="description"/>
        
        <union-subclass name="com.qiujy.domain.SingleSinger">
         <property name="gender" column="single_gender"/>
        </union-subclass>
        
        <union-subclass name="com.qiujy.domain.Bands">
         <property name="leader" column="bands_leader"/>
        </union-subclass>
 </class>


4. 策略选择
如果不需要多态查询:使用“每个具体类一张表”。
一定要使用多态查询:
子类中的属性相对较少,使用“整个继承树一张表”。
子类中的属性较多,使用“每个子类一张表”。

简单的问题一般选择“整个继承树一张表”,复杂案例一般选择“每个子类一张表”。

二. 组件映射: <component name="组件类的全限定名"></component>

三. 复合主键
通常将复合主键相关的属性,单独放到一个类中
此类必须实现序列化接口
覆写hashcode和equals方法
  <composite-id name="复合主键属性名" class="全限定名"></composite-id>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值