Hibernate(七)——继承映射
来源:互联网 发布:淘宝店设计装修多少钱 编辑:程序博客网 时间:2024/06/06 08:42
学了这么多的关系映射了,继承映射,从字面上也能了解到猜到几分。没错,继承映射就是为继承树而设置的一种映射方案。
继承映射的实现有三种策略:
- 单表继承。每棵类继承树使用一个表
- 类表继承。每个子类生成一个表。
- 具体表继承。每个类生成一个表。
我们还是用实例来说明一下,直接上图吧:
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标签
- <span style="font-size: 18px;"><?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></span>
- <?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>
以上三种策略,各有优缺点:
- 单表继承。查询速度最快,效率高,但是存在冗余字段。
- 类表继承。层次清楚,无冗余;但是如果使用自增主键方式会产生重复主键。需要使用手动分配主键。
- 具体表继承。层次最明了,这是优点,也是缺点,而且数据操作效率不高。
0 0
- Hibernate(七)——继承映射
- Hibernate(七)——继承映射
- 一口一口吃掉Hibernate(七)——继承映射
- Hibernate(七):继承映射
- hibernate 七, 继承映射
- Hibernate学习笔记(七)----集合映射、继承映射、作业
- Hibernate映射——一对多关联映射(七)
- Hibernate映射(二)——七种映射关系
- Hibernate映射——一对多关联映射(七)
- 浅析Hibernate映射(三)——继承映射
- Hibernate映射(三)——继承映射
- hibernate映射(五)——继承映射
- hibernate关系映射——继承映射
- hibernate映射关系——继承映射
- hibernate详解(七)---映射继承关系
- 千山万水之Hibernate(八)——继承映射
- Hibernate学习——(十)继承映射
- 【Hibernate】——三种继承映射
- mysql语句:批量更新多条记录的不同值
- tomcat+apache集群配置
- Objective-C 协议(protocol)
- web.xml配置项学习笔记
- 判断一个字符串能否通过添加一个字符变成回文串
- Hibernate(七)——继承映射
- 关于Android Studio 出现Unrecognized Windows Sockets error: 10107: Socket creation failed解决办法
- Android Studio中的git配置中文件修改颜色
- 第三周项目3-求集合并集
- 第四周-项目2 - 建设“单链表”算法库
- xml文件的处理
- MongoDB 基础操作
- jQuery写的一棵动态加载的树
- 算法导论第一章,第二章笔记