博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate上路_16-继承关系映射
阅读量:6718 次
发布时间:2019-06-25

本文共 2644 字,大约阅读时间需要 8 分钟。

hot3.png

例:员工Employee分为正式工SalaryEmployee和临时工HourEmployee。子类表的字段都不能使用非空约束。

1.三种继承关系的建表方式:

1)父类、子类在同一张表,表中有“辨别者列”。通过辨别者列值,区分父类数据和子类数据。

2)父类、子类各一张表。将公共数据放入父表,将个体数据存放子表,子表通过外键关联父表的公共数据。
3)父子类分别建表,父子表无关联,将父类数据存放到父类表,将子类数据存放子类表 ,父子表采用连续增长主键 

2.subClass方式:

父子类数据在同一张表,引入辨别者列(discriminator)用来区分数据记录是父类还是子类。

1)父子类POJO:

2)父类.hbm.xml配置:

对于继承关系映射,不需要为每个类建立hbm文件。只需要针对父类编写hbm即可。

3)作为单表操作:

(1)插入:

public void test(){		Session session = UtilGetSession.openSession();		Transaction transaction = session.beginTransaction();				PojoHuman human = new PojoHuman();		human.setName("地球人");				PojoWoman woman = new PojoWoman();		woman.setName("女人");		woman.setWaistline(36);		woman.setBeauty("漂亮");				PojoMan man = new PojoMan();		man.setName("男人");		man.setHeight(175);		man.setSpeed(12);				session.save(human);		session.save(woman);		session.save(man);				transaction.commit();		session.close();	}

(2)查询,通常使用HQL:

String hqlHuman="from PojoHuman";                Query queryHuman = session.createQuery(hqlHuman);                List listHuman = queryHuman.list();                System.out.println(listHuman);

3.joined-subclass方式:

为每个父类和子类建立单独数据表,将公共数据放入父表, 将个体信息存入子表,子表通过外键与父表关联。

1)类结构相同:

2)父类.hbm.xml配置:

3)测试:

(1)测试保存:

代码同上。

(2)测试查询:

同上。

(3)测试删除: 

PojoHuman human = new PojoHuman();                human.setId(2);	//父类托管对象                session.delete(human);

org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 

WARN: SQL Error: 1451, SQLState: 23000 
org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 
ERROR: Cannot delete or update a parent row: a foreign key constraint fails 
(`db_hibernate`.`tb_woman`, CONSTRAINT `FK_8n9ux8k3f9lja8fldi8om7cg0` FOREIGN KEY 
(`t_human_child`) REFERENCES `tb_human` (`t_id`)) 

4.union-subclass方式:

父类和子类单独建表,父表和子表无关联;父类数据插入父表,子类数据插入子表,父表和子表的主键连续自增。

注意:不能使用identity、native,因为需要在多张表完成主键连续自增;可以使用sequence(mysql不支持)、 increment (hibernate实现,max(id)+1)。

1)类结构相同:

2)父类.hbm.xml配置:

3)测试:

(1)测试保存:

(2)测试查询:

(3)查询删除:

5.建表原则:

如果父子类数据非常简单,可以使用subclass , 重点推荐joinedsubclass (性能最好),不推荐unionsubclass。

- end
 

转载于:https://my.oschina.net/vigiles/blog/177520

你可能感兴趣的文章
adb安装以及简单的操作
查看>>
前端项目部署
查看>>
JavaScript 工作原理之十五-类和继承及 Babel 和 TypeScript 代码转换探秘
查看>>
贝聊系统架构服务化之路
查看>>
ES6 的几个小技巧
查看>>
从Vue.js源码看nextTick机制
查看>>
前端如何处理emoji表情
查看>>
Git Client 安装及 SSH 公钥配置
查看>>
flutter接入现有的app详细介绍
查看>>
vue的虚拟dom
查看>>
如何设置一个本地测试服务器?
查看>>
iOS11以上 获取系统剩余可用空间不准确
查看>>
警告忽略
查看>>
Python3 CookBook | 迭代器与生成器
查看>>
深入理解 Android 中的各种 Context
查看>>
Android 6 0 运行时权限处理解析
查看>>
JavaScript引用类型之Array类型API详解
查看>>
数据库事务和MVCC多版本并发控制
查看>>
自定义控件实践-倒计时控件
查看>>
《JavaScript高级程序设计(第三版)》
查看>>