子类融合映射或者鉴别器映射,其实是我自己起的名字,方便我自己记忆而已,如果你们听了,请一笑而过就行了。(所有的类对应一张表)该方法也不是特别推荐
子类融合映射是通过父类的映射将子类的属性带出来,同时在运行类中不采用父类实例化,而都采用子类实例化,然后保存在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 约束,这会导致数据完整性的危险,导致父类的实例无法保存到数据库
所以该方法不是很推荐