继承关系对应的映射就叫做继承映射.继承映射有好多种解决方案:
a.简单继承映射:有多少个子类就写多少个映射文件.
b.所有子类映射到一张表,适用情况:子类教多,且子类较为简单,即只有个别属性!(通过一个特殊字段作为鉴别器区分是什么类对应的数据) 好处:因为使用一个映射文件, 减少了映射文件的个数. 缺点:不符合数据库设计原则.
c.每个类映射一张表:一个映射文件,存储所有的子类; 子类父类都对应表; 缺点:表结构比较复杂,插入一条子类信息,需要用2条sql: 往父类插入、往子类插入!
d.每个子类对应一张表,父类对应一张表.(推荐使用)
1)Animal.java
package com.bighuan.e_extends4; public class Animal { public 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; } } 2)Cat.java package com.bighuan.e_extends4; public class Cat extends Animal { public Cat(){ } // 抓老鼠 private String catchMouse; public String getCatchMouse() { return catchMouse; } public void setCatchMouse(String catchMouse) { this.catchMouse = catchMouse; } } 3)Monkey.java package com.bighuan.e_extends4; public class Monkey extends Animal { public Monkey() { } // 吃香蕉 private String eatBanana; public String getEatBanana() { return eatBanana; } public void setEatBanana(String eatBanana) { this.eatBanana = eatBanana; } } 4)映射文件 <?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="com.bighuan.e_extends4"> <!-- abstract="true" 指定实体类对象不对应表,即在数据库段不生成表 --> <class name="Animal" abstract="true"> <!-- 如果用union-subclass节点,主键生成策略不能为自增长! --> <id name="id"> <generator class="uuid"></generator> </id> <property name="name"></property> <!-- 子类:猫 t_cat union-subclass table 指定为表名, 表的主键即为id列 --> <union-subclass name="Cat" table="t_cat"> <property name="catchMouse"></property> </union-subclass> <!-- 子类:猴子 t_monkey --> <union-subclass name="Monkey" table="t_monkey"> <property name="eatBanana"></property> </union-subclass> </class> </hibernate-mapping>