文档章节

一口一口吃掉Hibernate(七)——继承映射

白志华
 白志华
发布于 2015/10/18 10:55
字数 791
阅读 5
收藏 0

       前几篇博文中讲到了常用的几种关联映射。其实Hibernate中还有一种“省劲儿”的映射,那就是——“继承映射”。


       学了这么多的关系映射了,继承映射,从字面上也能了解到猜到几分。没错,继承映射就是为继承树而设置的一种映射方案。


       继承映射的实现有三种策略:

  • 单表继承。每棵类继承树使用一个表
  • 类表继承。每个子类生成一个表。
  • 具体表继承。每个类生成一个表。


      我们还是用实例来说明一下,直接上图吧:


       Pig和Bird都继承自Animal,它们都有id,name,sex,但是Pig主要看weight,而Bird主要看height,此时如果把这些数据存入到数据库中,可以有3种方案,正好对应3种策略。


       ①. 只生成一个table,对应的继承映射策略是“单表继承”。如图:


       ②. 每个类生成一个table,对应的继承策略是“类表继承”。如图:


      ③. 生成3张表,对应的策略是“具体表继承”。如图:

       相信大家更愿意看代码,那就用代码说一下吧:

public class Animals {
	
	private int id;
	
	private String name;
	
	private boolean sex;

	//此处省略get,set方法
}

public class Bird extends Animals {

	private int height;
	
	//此处省略get,set方法
}

public class Pig extends Animals {

	private int weight;
	
	//此处省略get,set方法
}

       第一种对应的映射文件:使用discriminator和subclass标签

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bjpowernode.hibernate">
	<class name="Animals" table="t_animals" lazy="false">
		<id name="id">
			<generator class="native"/>
		</id>
		<discriminator column="type" type="string"></discriminator>
		<property name="name"/>
		<property name="sex"></property>
		<subclass name="Pig"  discriminator-value="P">
			<property name="weight"></property>
		</subclass>
		<subclass name="Bird" discriminator-value="B">
			<property name="height"></property>
		</subclass>
	</class>
</hibernate-mapping>


       discriminator,英文解释是“辨别器”。它是用于设置辨别数据的字段,放在id下面,同时使用subclass来配置不同的类,设置discriminator-value,来辨别不同的数据。


      第二种映射文件:使用union-subclass标签

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bjpowernode.hibernate">
	<class name="Animals" table="t_animals" abstract="true">
		<id name="id">
			<!-- 不能使用native,因为自增会出现两个表一样的id -->
			<generator class="assigned"/>
		</id>
		<property name="name"/>
		<property name="sex"/>
		<union-subclass name="Pig" table="t_pig">
			<property name="weight" />
		</union-subclass>
		<union-subclass name="Bird" table="t_bird">
			<property name="height" />
		</union-subclass>
	</class>
</hibernate-mapping>


      第三种映射文件:使用 joined-subclass标签

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bjpowernode.hibernate">
	<class name="Animals" table="t_animals" lazy="false">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<property name="sex"/>
		<joined-subclass name="Pig" table="t_pig">
			<key column="pid" />
			<property name="weight" />
		</joined-subclass>
		<joined-subclass name="Bird" table="t_bird">
			<key column="bid" />
			<property name="height" />
		</joined-subclass>
	</class>
</hibernate-mapping>


       以上三种策略,各有优缺点:

  • 单表继承。查询速度最快,效率高,但是存在冗余字段。
  • 类表继承。层次清楚,无冗余;但是如果使用自增主键方式会产生重复主键。需要使用手动分配主键。
  • 具体表继承。层次最明了,这是优点,也是缺点,而且数据操作效率不高。

版权声明:本文为博主原创文章,未经博主允许不得转载。

本文转载自:http://blog.csdn.net/xiaoxian8023/article/details/15340473

共有 人打赏支持
白志华
粉丝 29
博文 265
码字总数 57524
作品 0
长沙
程序员
Java程序员从笨鸟到菜鸟全部博客目录【2012年十一月七日更新】

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 大学上了一年半,接触java也一年半了,虽然中间也有其他东西的学习,但是还是以java为主路线,想想这一年半,...

长平狐
2012/11/12
103
0
Java程序员从笨鸟到菜鸟全部博客目录【2012年十一月七日更新】

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 大学上了一年半,接触java也一年半了,虽然中间也有其他东西的学习,但是还是以java为主路线,想想这一年半,...

长平狐
2012/11/12
79
0
2016年上半年信息系统项目管理师真题之上午题小虎趣味解答第16-20题

 2016年上半年信息系统项目管理师真题之四 小虎趣味解答第16-20题 16.在信息系统安全保护中,依据安全策略控制用户对文件数据库表等客体的访问属于()安全管理 A.安全审计 B.入侵检测...

littletigerbj
2017/04/03
0
0
《Java程序员由笨鸟到菜鸟》电子版书正式发布,欢迎大家下载

在众多朋友的支持和鼓励下,《Java程序员由菜鸟到笨鸟》电子版终于和大家见面了。本电子书涵盖了从java基础到javaweb开放框架的大部分内容。在编写的过程中,难免会出现一些错误,希望大家能...

长平狐
2012/11/12
78
0
《Java程序员由笨鸟到菜鸟》电子版书正式发布,欢迎大家下载

在众多朋友的支持和鼓励下,《Java程序员由菜鸟到笨鸟》电子版终于和大家见面了。本电子书涵盖了从java基础到javaweb开放框架的大部分内容。在编写的过程中,难免会出现一些错误,希望大家能...

长平狐
2012/11/12
84
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

iOS开发用到的图片尺寸汇总

启动图 型号 竖屏 横屏 iPhone SE 640px × 1136px 1136px × 640px iPhone 6s 750px × 1334px 1334px × 750px iPhone 6s Plus 1242px × 2208px 2208px × 1242px iPhone 7 750px × 1334......

业界小白
14分钟前
0
0
浅谈redis

redis是一个开源,内存式的健值存储数据库,也被称为健值存储的字典服务器。健值类型有字符串,hash(哈希类型),set(集合),list(列表) 和有序集合 特征细节: 内存式:redis将健值存储在主...

拐美人
22分钟前
0
0
无限扩容,按需使用!ZStack推出基于阿里云NAS的文件存储服务

日前,ZStack发布2.6.0版本,正式宣布推出基于阿里云NAS的文件存储服务。得益于业界领先的阿里云分布式存储架构,融合NAS后的ZStack 2.6.0拥有高性能、高可靠、容量无限扩展、一键操作、按需...

ZStack社区版
24分钟前
1
0
崛起于Springboot2.X之Mongodb多数据源处理(35)

多数据源:4个mongodb库! 目录结构图: 1、添加pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId>......

木九天
30分钟前
0
0
如何获取显示器的EDID信息

Q1: 为什么要写这篇文章? A1:在最近的工作中遇到了不少问题,其中很多都是和EDID相关的。可以说,作为一家以“显示”为生的企业,我们时时刻刻在与EDID打交道。EDID这东西很简单,但是如果...

DB_Terrill
30分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部