Hibernate基础------》关系映射---》继承映射-》所有类映射到一张表中(类融合映射或者鉴别器映射)

本文介绍了一种通过父类映射实现子类属性融合的方法,并提供了具体代码示例,展示如何使用鉴别器在运行时区分不同子类。

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

子类融合映射或者鉴别器映射,其实是我自己起的名字,方便我自己记忆而已,如果你们听了,请一笑而过就行了。(所有的类对应一张表)该方法也不是特别推荐

子类融合映射是通过父类的映射将子类的属性带出来,同时在运行类中不采用父类实例化,而都采用子类实例化,然后保存在session当中。


例子:猫和猴子是动物,猫喜欢抓老鼠 ,猴子喜欢爬树


代码:

动物类(父类)

public abstract class Animal {
    private int id;
    private String name;


猫类继承动物类

猴子类也继承动物类


动物的配置(此处就是知识点,不写猫类和猴子类的配置而直接写动物类,在动物类中使用 discriminator(鉴别器)来区分猫和猴子)

<class name="Animal"  table="T_namial">   
        <id name="id" column="id">
            <generator class="native"/>
        </id>
        <discriminator column="Type_"></discriminator>
    <!--这个discriminator一定要放在property的前面,否则将会出现不能解读xml由于鉴别器的不存在 异常
    --><property name="name" column="name"></property>
    <subclass name="Cat" discriminator-value="cat_">
        <property name="CauchMouse"></property>
    </subclass>
    <subclass name="Monkey" discriminator-value="monkey_">
        <property name="climing"></property>
    </subclass>
    </class>


运行类

        Cat c = new Cat();
        c.setCauchMouse("猫抓老鼠厉害");
        c.setName("猫");
        
        Monkey m = new Monkey();
        m.setCliming("猴子上树快");
        m.setName("猴子");
        
        
        session.save(m);
        session.save(c);


效果图


需要注意的是:大家请看所有的列的值,是否有null的存在,那么这会导致我们使用了subclass就无法使用not null 约束,这会导致数据完整性的危险,导致父类的实例无法保存到数据库

所以该方法不是很推荐




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值