本例模仿的是每个子类映射一张表, 父类不对应表(2张表),以动物,猴子,猫为例,只须将Animal.hbm.xml和Animal类文件简单修改即可,其他参考文件请参照我的上篇文章《hibernate中继承映射配置详细解析(三)》,下面是需要改动的文件
1.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">
<!--映射文件:映射一个实体类对象,描述一个对象最终可以直接保存对象数据到数据库中 -->
<!-- package:要映射的对象所在的包(可选,如果不指定,此文件下所有的类都要指定全路径)
auto-import 默认为true,在写HQL的时候自动导入包名
如果指定为false,在写HQL的时候必须要写上类的全名-->
<!--
继承映射, 所有的子类都映射到一张表
-->
<hibernate-mapping package="cn.itcast.e_extends4">
<!--
abstract="true" 指定实体类对象不对应表,即在数据库段不生成表
-->
<class name="Animal" abstract="true">
<id name="id">
<!-- 如果用union-subclass节点,主键生成策略不能为自增长! -->
<generator class="uuid"></generator>
</id>
<property name="name"></property>
<union-subclass name="Cat" table="t_cat">
<property name="catchMouse"></property>
</union-subclass>
<union-subclass name="Monkey" table="t_monkey">
<property name="eatBanana"></property>
</union-subclass>
</class>
</hibernate-mapping>
2.Animal
package cn.itcast.e_extends4;
//动物类
public class Animal {
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
因为主键不能为自增长,所以将其主键设置为随机获取,因为是一个字符串序列,所以将Animal类文件中的id改为String类型
总结:
所有的子类都写到一个映射文件;
父类不对应表; 每个子类对应一张表