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

简介:        前几篇博文中讲到了常用的几种关联映射。其实Hibernate中还有一种“省劲儿”的映射,那就是——“继承映射”。        学了这么多的关系映射了,继承映射,从字面上也能了解到猜到几分。

       前几篇博文中讲到了常用的几种关联映射。其实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>


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

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

目录
相关文章
|
4月前
|
Java 数据库连接 API
解锁高效开发秘籍:深入探究 Hibernate 如何优雅处理一对多与多对多关系,让数据映射再无烦恼!
【9月更文挑战第3天】Hibernate 是 Java 领域中最流行的 ORM 框架之一,广泛用于处理实体对象与数据库表之间的映射。尤其在处理复杂关系如一对多和多对多时,Hibernate 提供了丰富的 API 和配置选项。本文通过具体代码示例,展示如何使用 `@OneToMany`、`@JoinColumn`、`@ManyToMany` 和 `@JoinTable` 等注解优雅地实现这些关系,帮助开发者保持代码简洁的同时确保数据一致性。
78 4
|
5月前
|
Java 数据库连接 数据库
AI 时代风起云涌,Hibernate 实体映射引领数据库高效之路,最佳实践与陷阱全解析!
【8月更文挑战第31天】Hibernate 是一款强大的 Java 持久化框架,可将 Java 对象映射到关系数据库表中。本文通过代码示例详细介绍了 Hibernate 实体映射的最佳实践,包括合理使用关联映射(如 `@OneToMany` 和 `@ManyToOne`)以及正确处理继承关系(如单表继承)。此外,还探讨了常见陷阱,例如循环依赖可能导致的无限递归问题,并提供了使用 `@JsonIgnore` 等注解来避免此类问题的方法。通过遵循这些最佳实践,可以显著提升开发效率和数据库操作性能。
102 0
|
5月前
|
数据库 开发者 Java
Hibernate映射注解的魔力:实体类配置的革命,让你的代码量瞬间蒸发!
【8月更文挑战第31天】Hibernate 是一款出色的对象关系映射框架,简化了 Java 应用与数据库的交互。其映射注解让实体类配置变得直观简洁。本文深入剖析核心概念与使用技巧,通过示例展示如何简化配置。
66 0
|
SQL XML 存储
Hibernate框架【五】——基本映射——多对多映射
Hibernate框架【五】——基本映射——多对多映射
211 0
|
8月前
|
缓存 Java 数据库连接
Hibernate或MyBatis:ORM映射、缓存机制等知识讲解梳理
Hibernate或MyBatis:ORM映射、缓存机制等知识讲解梳理
141 0
|
8月前
|
Java 数据库连接 数据库
Hibernate5中实体映射命名策略
Hibernate5中实体映射命名策略
154 0
|
8月前
|
SQL 存储 Java
Hibernate - 继承关联关系映射
Hibernate - 继承关联关系映射
78 0
|
8月前
|
SQL Java 关系型数据库
Hibernate - Java 类型, Hibernate 映射类型及 SQL 类型之间的对应关系
Hibernate - Java 类型, Hibernate 映射类型及 SQL 类型之间的对应关系
84 0
|
SQL XML Java
Hibernate框架【四】——基本映射——多对一和一对多映射
Hibernate框架【四】——基本映射——多对一和一对多映射
194 0
|
XML 存储 Java
Hibernate框架【三】——基本映射——一对一映射
Hibernate框架【三】——基本映射——一对一映射
93 0

热门文章

最新文章