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 ...
随机推荐
- hdu 3117 Fibonacci Numbers
这道题其实也是水题来的,求Fibonacci数的前4位和后4位,在n==40这里分界开.后4位不难求,因为n达到了10^18的规模,所以只能用矩阵快速幂来求了,但在输出后4位的时候一定要注意前导0的处 ...
- jQuery DOM
请尊重知识,请尊重原创 更多资料参考请见 http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1 jQuer ...
- golang 资源
1.Learning Go <学习Go语言> http://www.miek.nl/projects/learninggo/中文版http://mikespook.com/learning ...
- Map在内存中的结构
- 怎么进入BAT的研发部门?
怎么进入BAT的研发部门? ======================================剑指offer+leetcode+geeksforgeeks+编程之美+算法导论====秒杀BA ...
- 转:C++中Static作用和使用方法
转自:http://blog.csdn.net/artechtor/article/details/2312766 1.什么是static? static 是C++中很常用的修饰符,它被用 ...
- Jq_Ajax 操作函数跟JQuery 遍历函数跟JQuery数据操作函数
JQuery文档操作方法 jQuery 库拥有完整的 Ajax 兼容套件.其中的函数和方法允许我们在不刷新浏览器的情况下从服务器加载数据. 函数 ...
- SqlServer扩展存储过程
1. 扩展存储过程xp_cmdshell用法: --1.启用 SP_CONFIGURE RECONFIGURE GO SP_CONFIGURE RECONFIGURE GO --2.用法 master ...
- 数据库中间件mycat简单入门
当在项目中mysql数据库成为瓶颈的时候,我们一般会使用主从复制,分库分表的方式来提高数据库的响应速度,比如mysql主从复制,在没有数据库中间件的情况下,我们只能由开发工程师在程序中控制,这对于一个 ...
- 如何理解和熟练使用JS 中的call apply
有时候看一两个关于apply或call的小例子,感觉能够理解一点点但是下次碰到又要纠结半天才能转过弯来-而且不知道怎么应用到实际工作当中去- call 和 apply 都是为了改变某个函数运行时的 c ...