Hibernate中的继承映射
1.继承映射
继承映射分为两种情况:简单继承映射和继承映射。
在简单继承映射中,每个子类都要写一个映射文件。
在继承映射中,只使用一个映射文件。继承映射分为三种情况:
所有子类映射到一张表
需要使用鉴别器字段,不符合数据库设计原则
每个类映射到一张表
父类映射到一张表,插入一条子类信息,需要两条sql,父子表之间有外键约束
每个类映射到一张表,父类不映射表
必须使用uuid作为主键类型,所以bean中主键对应的属性不能是int类型
2.简单继承映射
<?xml version="1.0" encoding="utf-8" ?>
<!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.juaner.hibernate.extendMap">
<class name="Cat" table="t_cat">
<!--简单继承映射-->
<id name="id">
<generator class="native"/>
</id>
<property name="name" length="25" type="string"/>
<property name="catchMouse" length="25"/>
</class> </hibernate-mapping>
在这种情况下,获取数据的时候,当写HQL查询时,通过父类查询必须写类的全名:
@Test
public void test1(){
Session session = sf.openSession();
session.beginTransaction(); //获取的时候,当写hql查询的时候,通过父类查询必须写上类的全名
Query query = session.createQuery("from com.juaner.hibernate.extendMap.Animal");
List<Animal> list = query.list();
for(Animal animal:list){
System.out.println(animal);
} session.getTransaction().commit();
session.close();
}
3.所有子类映射到一张表
<?xml version="1.0" encoding="utf-8" ?>
<!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.juaner.hibernate.extendMap">
<class name="Animal" table="t_animal">
<id name="id">
<generator class="native"/>
</id>
<!--指定鉴别器字段,用于区别子类信息
必须放到id下面,property上面
如果不指定具体值,默认为当前子类的全名
-->
<discriminator column="type_"/>
<property name="name" length="25" type="string"/>
<!--子类信息-->
<subclass name="Cat" discriminator-value="cat_">
<property name="catchMouse" length="25"/>
</subclass>
<subclass name="Monkey" discriminator-value="monkey_">
<property name="eatBanana" length="25"/>
</subclass>
</class>
</hibernate-mapping>
生成的表:

4.每个类映射到一张表
<?xml version="1.0" encoding="utf-8" ?>
<!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.juaner.hibernate.extendMap">
<class name="Animal" table="t_animal">
<id name="id">
<generator class="native"/>
</id> <property name="name" length="25"/>
<!--需要设置外键约束-->
<joined-subclass name="Cat" table="t_cat">
<key column="animal_id"></key>
<property name="catchMouse" length="25"/>
</joined-subclass>
<joined-subclass name="Monkey" table="t_monkey">
<key column="animal_id"></key>
<property name="eatBanana"/>
</joined-subclass>
</class>
</hibernate-mapping>
执行的sql语句
Hibernate: insert into t_animal (name) values (?)
Hibernate: insert into t_cat (catchMouse, animal_id) values (?, ?)
Hibernate: insert into t_animal (name) values (?)
Hibernate: insert into t_monkey (eatBanana, animal_id) values (?, ?)
5.每个类映射到一张表,父类不映射表
<?xml version="1.0" encoding="utf-8" ?>
<!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.juaner.hibernate.extendMap">
<class name="Animal">
<id name="id">
<generator class="uuid"/>
</id>
<property name="name" length="25"/>
<!--每个子类的表的主键为id列,但是主键不能为自增长的-->
<union-subclass name="Cat" table="t_cat">
<property name="catchMouse" length="25"/>
</union-subclass>
<union-subclass name="Monkey" table="t_monkey">
<property name="eatBanana" length="25"/>
</union-subclass>
</class> </hibernate-mapping>
Hibernate中的继承映射的更多相关文章
- Hibernate中的一对一映射关系
Hibernate中的一对一映射关系有两种实现方法(单向一对一,和双向一对一)(一对一关系:例如一个department只能有一个manager) 单向和双向有什么区别呢??例如若是单向一对一,比如在 ...
- HIbernate学习笔记(七) hibernate中的集合映射和继承映射
九. 集合映射 1. Set 2. List a) @OrderBy 注意:List与Set注解是一样的,就是把Set更改为List就可以了 private List< ...
- 【Hibernate 5】继承映射配置及多态查询
一.继承实现的三种策略 1.1,单表继承.每棵类继承树使用一个表(table per class hierarchy) -->本文主要介绍的继承策略 类继承树对应多个类,要把多个类的信息存放在一 ...
- 【Hibernate步步为营】--继承映射具体解释
上篇文章讨论了多对多映射,在使用多对多映射时重点是使用<many-to-many>标签,并在标签的两端加入外键这样在生成关系时会创建两个关系之间的关系表,通过关系表来维护它们之间的关系,另 ...
- Hibernate总结(二)---hibernate中的各种映射
知识的准备: (参考:汤阳光Hibernate3.6(基础)) 一.浅谈javaBean之间的关系 存在的关系: 1.关联(一对一.一对多.多对一.多对多) 2.聚合/组合(最后考虑) 3.继承 所以 ...
- Hibernate 中对象关系映射(ObjectRelationMapping)
1.什么是对象关系映射? 解析:对象-关系映射(Object Relational Mapping,简称ORM,对象关系映射)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说, ...
- Hibernate中的组合映射
1.实体bean设计 car: public class Car { private int id; private String name; private Wheel wheel; set... ...
- Hibernate中一对一关联映射/组件映射
Hibernate映射:一对一关联 1.按照外键映射 2.按照主键映射 组件映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映射方式分别 ...
- Hibernate中的一对一映射
1.需求 用户和身份证是一一对应的关系. 有两种对应方式: 用户id作为身份证表的外键,身份证号作为主键: 用户id作为身份证表的主键: 2.实体Bean设计 User: public class U ...
随机推荐
- Android 新手引导
关于这个Demo的写法很多 我也献上一段 效果图如下 上代码 MainActivity public class MainActivity extends Activity { // public L ...
- eclipse插件安装 (zhuan)
https://my.oschina.net/gxs2012/blog/205875 http://blog.csdn.net/zhujiaxing666666/article/details/150 ...
- Linux 下没有 my.cnf 文件的解决方式,完全是我自己整的,好多教程都是瞎扯的 (zhuan)
http://blog.csdn.net/jspping/article/details/40400691?utm_source=tuicool&utm_medium=referral *** ...
- Kafka的配置文件详细描述
在kafka/config/目录下面有3个配置文件: producer.properties consumer.properties server.properties (1).producer.pr ...
- C# Socket编程(3)编码和解码
在网络通信中,很多情况下:比如说QQ聊天,通讯双方直接传递的都是字符信息.但是字符信息并不能够直接通过网络传输,这些字符集必须先转换成一个字节序列后才能够在网络中传输,于是这里就产生了编码和解码的概念 ...
- PCA in Bioinformatics
光看原理和代码是没用的,得看看具体算法在实际中的用途,多看看文献. Principal component analysis for clustering gene expression data
- 为什么MySQL死锁检测会严重降低TPS
在大量的客户端,更新数据表的同一行时,会造成数据库的吞吐量大幅降低. 很多数据库的前辈和同行分别通过实验和源码的方法,定位到了罪魁祸首----MySQL死锁检测 实验方式:http://blog.cs ...
- robot API笔记6
robot.libraries 计划举办机器人框架标准测试库. 图书馆是主要用于外部的测试数据,但是他们可以 也使用自定义测试库是否有必要. 特别是 的内装式 图书馆通常是有用的 当需要与框架. 因为 ...
- C++一个简单的类
从基本数据类型说起: 一般情况下,c++中的基本数据类型有int ,char,,,, 但是这些数据类型是有限的,而且还是C++中自带的,缺乏灵活性 于是C++提供了一种定义自定义类型的方式----使用 ...
- Android画一条横线
<View android:layout_width="match_parent" android:layout_height="1px" android ...