(不推荐使用)Hibernate的继承映射形式一:
所有子类映射到一张表 (数据库只有一张表)
1、什么情况用:子类教多,且子类较为简单,即只有个别属性!
2、好处:因为使用一个映射文件, 减少了映射文件的个数。
3、缺点:(不符合数据库设计原则)
一个映射文件: Animal.hbm.xml(如何区分是哪个子类的信息?)
4、数据库设计:t_animal (要存储所有的子类信息)
“鉴别器”
Id name catchMouse eatBanana type_(区别是哪个子类)
1 大马猴 NULL 吃10个香蕉 猴子
2 大花猫 不抓老鼠 NULL 猫
5、javabean设计:
1)Animal.java
2)Cat.java
3)Monkey.java
6、映射文件的配置:Animal.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--
继承映射,所有的子类都映射到一张表
-->
<hibernate-mapping package="sram.extends2" auto-import="true">
<class name="Animal" table="t_animal">
<!-- 父类信息 -->
<id name="id">
<generator class="native"></generator>
</id>
<!--
指定鉴别器字段(作用:区分不同的子类),
注意:<discriminator></discriminator>的书写位置
必须放在<id></id>标签下,<property></property>标签上
-->
<discriminator column="type_"></discriminator>
<property name="name"></property>
<!--
子类:猫
每个子类都用subclass节点映射
注意:一定要指定鉴别器字段,否则报错!
Caused by:org.hibernate.MappingException:No discriminator found for...
鉴别器字段作用:用于在数据库中区别每一个子类的信息,就是一个列!
-->
<!--
discriminator-value="cat_"作用:
指定鉴别器字段,即上述鉴别器中的type_字段的值
如果不指定,默认为当前子类的全名(sram.extends2.Cat)
-->
<subclass name="Cat" discriminator-value="cat_">
<property name="catchMouse"></property>
</subclass>
<!--
子类:猴子
-->
<subclass name="Monkey" discriminator-value="monkey_">
<property name="eatBanana"></property>
</subclass>
</class>
</hibernate-mapping>
7、测试类App.java
8、总结:
1)写法较为简单:所有子类用一个映射文件,且映射到一张表!
2)但数据库设计不合理!