hibernate详解(二)----->>继承关系映射(二、三)
这篇文章紧接着hibernate详解(二)----->>继承关系映射(一)。
下面介绍另外两种关系继承关系映射方案:
第二种:每个子类一张表
其他的类都一样,就有一个xml文件不一样,里面有些内容不一样
Student.hbm.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <!-- 映射持久化类 -->
- <class name="com.zxf.domain.Singer" table="singer">
- <!-- 映射对象标识符 -->
- <id name="id" column="id" type="long">
- <generator class="native" />
- </id>
- <!-- 映射普通属性 -->
- <property name="name" />
- <property name="region" />
- <property name="description" />
- <!-- 用joined-subclass元素给每个子类映射到一张表 -->
- <joined-subclass name="com.zxf.domain.SingleSinger"
- table="single_singer">
- <!-- 用key元素来指定子类和父类之间是通过哪个字段来关联的 -->
- <key column="singler_id" />
- <!-- 映射本子类的属性 -->
- <property name="gender" />
- </joined-subclass>
- <!-- 用joined-subclass元素给每个子类映射到一张表 -->
- <joined-subclass name="com.zxf.domain.Bands"
- table="bands">
- <!-- 用key元素来指定子类和父类之间是通过哪个字段来关联的 -->
- <key column="bands_id" />
- <!-- 映射本子类的属性 -->
- <property name="leader"/>
- </joined-subclass>
- </class>
- </hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!-- 映射持久化类 --> <class name="com.zxf.domain.Singer" table="singer"> <!-- 映射对象标识符 --> <id name="id" column="id" type="long"> <generator class="native" /> </id> <!-- 映射普通属性 --> <property name="name" /> <property name="region" /> <property name="description" /> <!-- 用joined-subclass元素给每个子类映射到一张表 --> <joined-subclass name="com.zxf.domain.SingleSinger" table="single_singer"> <!-- 用key元素来指定子类和父类之间是通过哪个字段来关联的 --> <key column="singler_id" /> <!-- 映射本子类的属性 --> <property name="gender" /> </joined-subclass> <!-- 用joined-subclass元素给每个子类映射到一张表 --> <joined-subclass name="com.zxf.domain.Bands" table="bands"> <!-- 用key元素来指定子类和父类之间是通过哪个字段来关联的 --> <key column="bands_id" /> <!-- 映射本子类的属性 --> <property name="leader"/> </joined-subclass> </class> </hibernate-mapping>
运行结果如下图所示:
第三种:每个具体类一张表
其他的类都一样,就有一个xml文件不一样,里面有些内容不一样
Student.hbm.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <!-- 指定此类为抽象类 -->
- <class name="com.zxf.domain.Singer" abstract="true">
- <!-- 映射对象标识符 -->
- <id name="id" column="id" type="long">
- <!-- 映射主键生成方式为由Java应用程序负责生成标识符 -->
- <generator class="assigned" />
- </id>
- <!-- 映射普通属性 -->
- <property name="name" />
- <property name="region" />
- <property name="description" />
- <!-- 用union-subclass元素给每个具体子类映射到一张表 -->
- <union-subclass name="com.zxf.domain.SingleSinger"
- table="single_singer">
- <!-- 映射本子类的属性 -->
- <property name="gender" />
- </union-subclass>
- <!-- 用union-subclass元素给每个具体子类映射到一张表 -->
- <union-subclass name="com.zxf.domain.Bands"
- table="bands">
- <!-- 映射本子类的属性 -->
- <property name="leader"/>
- </union-subclass>
- </class>
- </hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!-- 指定此类为抽象类 --> <class name="com.zxf.domain.Singer" abstract="true"> <!-- 映射对象标识符 --> <id name="id" column="id" type="long"> <!-- 映射主键生成方式为由Java应用程序负责生成标识符 --> <generator class="assigned" /> </id> <!-- 映射普通属性 --> <property name="name" /> <property name="region" /> <property name="description" /> <!-- 用union-subclass元素给每个具体子类映射到一张表 --> <union-subclass name="com.zxf.domain.SingleSinger" table="single_singer"> <!-- 映射本子类的属性 --> <property name="gender" /> </union-subclass> <!-- 用union-subclass元素给每个具体子类映射到一张表 --> <union-subclass name="com.zxf.domain.Bands" table="bands"> <!-- 映射本子类的属性 --> <property name="leader"/> </union-subclass> </class> </hibernate-mapping>
运行结果如下图所示:
备注:
继承映射最常用的方案就是以上介绍的三种,在实际开发中,怎么选择合适的方案,笔者根据自己的工作经验,给读者提供一些经验。
- 如果不需要度多态查询:使用每个具体类一张表。
- 一定要使用多态查询:子类中的属性相对较少,使用每个继承层次一张表。
- 子类中的属性较多,使用每个子类一张表。
- 简单的问题一般选择每个继承层次一张表,复杂案例额一般选择每个子类一表。