(14)Hibernate继承映射
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,人们总是在失去时,才了解到事情的本质需求:动物、猫、猴子1、简单继承映射Animal.javapackage com.rk.hibernate.n_inheritance1;public abstra
千家信息网最后更新 2025年11月08日(14)Hibernate继承映射
| 人们总是在失去时,才了解到事情的本质 |
需求:动物、猫、猴子
1、简单继承映射
Animal.java
package com.rk.hibernate.n_inheritance1;public abstract class Animal{ private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }Cat.java
package com.rk.hibernate.n_inheritance1;public class Cat extends Animal{ private String catchMouse; public String getCatchMouse() { return catchMouse; } public void setCatchMouse(String catchMouse) { this.catchMouse = catchMouse; } @Override public String toString() { return "Cat [id=" + getId() + ", name=" + getName() + ", catchMouse=" + catchMouse + "]"; } }Cat.hbm.xml
App.java
package com.rk.hibernate.n_inheritance1;import java.util.List;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.junit.Test;public class App{ private static SessionFactory sf; static { sf = new Configuration() .configure() .addClass(Cat.class) .buildSessionFactory(); } @Test public void testSave() { Session session = sf.openSession(); session.beginTransaction(); //猫 Cat cat = new Cat(); cat.setName("大花猫"); cat.setCatchMouse("抓小老鼠"); //保存 session.save(cat); session.getTransaction().commit(); session.close(); } @Test public void testGetCat() { Session session = sf.openSession(); session.beginTransaction(); //通过HQL查询Cat Query q = session.createQuery("from Cat"); List list = q.list(); System.out.println(list); session.getTransaction().commit(); session.close(); } @Test public void testGetAnimal() { Session session = sf.openSession(); session.beginTransaction(); // 获取时候注意:当写hql查询的使用,通过父类查询必须写上类的全名 Query q = session.createQuery("from com.rk.hibernate.n_inheritance1.Animal"); List list = q.list(); System.out.println(list); session.getTransaction().commit(); session.close(); }} 生成的T_Cat表
| 总结:简单继承映射,有多少个子类,写多少个映射文件! |
2、继承映射
下面3种方法都是只使用一个映射文件(Animal.hbm.xml文件),但是不同的方法生成的数据库表的数量不同。
2.1、所有子类映射到同一张表(1张表)
什么情况用?
子类教多,且子类较为简单,即只有个别属性!
好处:因为使用一个映射文件, 减少了映射文件的个数。
缺点:(不符合数据库设计原则)
Animal.java
package com.rk.hibernate.n_inheritance2;public abstract class Animal{ private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }Cat.java
package com.rk.hibernate.n_inheritance2;public class Cat extends Animal{ private String catchMouse; public String getCatchMouse() { return catchMouse; } public void setCatchMouse(String catchMouse) { this.catchMouse = catchMouse; } @Override public String toString() { return "Cat [id=" + getId() + ", name=" + getName() + ", catchMouse=" + catchMouse + "]"; } }Monkey.java
package com.rk.hibernate.n_inheritance2;public class Monkey extends Animal{ private String eatBanana; public String getEatBanana() { return eatBanana; } public void setEatBanana(String eatBanana) { this.eatBanana = eatBanana; } }Animal.hbm.xml
App.java
package com.rk.hibernate.n_inheritance2;import java.util.List;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.junit.Test;public class App{ private static SessionFactory sf; static { sf = new Configuration() .configure() .addClass(Animal.class) .buildSessionFactory(); } @Test public void testSave() { Session session = sf.openSession(); session.beginTransaction(); //猫 Cat cat = new Cat(); cat.setName("大花猫"); cat.setCatchMouse("抓小老鼠"); //猴子 Monkey monkey = new Monkey(); monkey.setName("淘气猴"); monkey.setEatBanana("吃黄香蕉"); //保存 session.save(cat); session.save(monkey); session.getTransaction().commit(); session.close(); } }生成的T_Animals表

| 总结:写法较为简单:所有子类用一个映射文件,且映射到一张表!但数据库设计不合理!不推荐用。 |
2.2、每个类映射一张表(3张表)
Animal.java
package com.rk.hibernate.n_inheritance3;public abstract class Animal{ private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }Cat.java
package com.rk.hibernate.n_inheritance3;public class Cat extends Animal{ private String catchMouse; public String getCatchMouse() { return catchMouse; } public void setCatchMouse(String catchMouse) { this.catchMouse = catchMouse; } @Override public String toString() { return "Cat [id=" + getId() + ", name=" + getName() + ", catchMouse=" + catchMouse + "]"; } }Monkey.java
package com.rk.hibernate.n_inheritance3;public class Monkey extends Animal{ private String eatBanana; public String getEatBanana() { return eatBanana; } public void setEatBanana(String eatBanana) { this.eatBanana = eatBanana; } }Animal.hbm.xml
App.java
package com.rk.hibernate.n_inheritance3;import java.util.List;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.junit.Test;public class App{ private static SessionFactory sf; static { sf = new Configuration() .configure() .addClass(Animal.class) .buildSessionFactory(); } @Test public void testSave() { Session session = sf.openSession(); session.beginTransaction(); //猫 Cat cat = new Cat(); cat.setName("大花猫"); cat.setCatchMouse("抓小老鼠"); //猴子 Monkey monkey = new Monkey(); monkey.setName("淘气猴"); monkey.setEatBanana("吃黄香蕉"); //保存 session.save(cat); session.save(monkey); session.getTransaction().commit(); session.close(); } }生成的T_Animal_Each表
生成的T_Cat_Each表

生成的T_Monkey_Each表
| 总结:一个映射文件,存储所有的子类; 子类父类都对应表; 缺点:表结构比较负责,插入一条子类信息,需要用2条sql: 往父类插入、往子类插入! |
2.3、(推荐)每个子类映射一张表, 父类不对应表(2张表)
Animal.java
package com.rk.hibernate.n_inheritance4;public abstract class Animal{ private String id; private String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }Cat.java
package com.rk.hibernate.n_inheritance4;public class Cat extends Animal{ private String catchMouse; public String getCatchMouse() { return catchMouse; } public void setCatchMouse(String catchMouse) { this.catchMouse = catchMouse; } @Override public String toString() { return "Cat [id=" + getId() + ", name=" + getName() + ", catchMouse=" + catchMouse + "]"; } }Monkey.java
package com.rk.hibernate.n_inheritance4;public class Monkey extends Animal{ private String eatBanana; public String getEatBanana() { return eatBanana; } public void setEatBanana(String eatBanana) { this.eatBanana = eatBanana; } }Animal.hbm.xml
App.java
package com.rk.hibernate.n_inheritance4;import java.util.List;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.junit.Test;public class App{ private static SessionFactory sf; static { sf = new Configuration() .configure() .addClass(Animal.class) .buildSessionFactory(); } @Test public void testSave() { Session session = sf.openSession(); session.beginTransaction(); //猫 Cat cat = new Cat(); cat.setName("大花猫"); cat.setCatchMouse("抓小老鼠"); //猴子 Monkey monkey = new Monkey(); monkey.setName("淘气猴"); monkey.setEatBanana("吃黄香蕉"); //保存 session.save(cat); session.save(monkey); session.getTransaction().commit(); session.close(); } }生成的T_Animal_Final表,虽然会生成这个表,但是不会存储数据
生成的T_Cat_Final表
生成的T_Monkey_Final表
| 总结:所有的子类都写到一个映射文件;父类不对应表; 每个子类对应一张表。 |
子类
生成
文件
数据
猴子
老鼠
花猫
淘气
数据库
香蕉
查询
不同
方法
缺点
存储
推荐
设计
不合理
个子
个数
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
魔兽服务器慈善义卖
爱迪森科是一种什么数据库
医保系统软件开发
北京美标网络技术开发公司
杭州麻溜儿网络技术
软件开发办公照
乐动体育服务器异常稍后再试
站群云服务器
关于网络安全的故事片段
大学生网络安全意识的问题
编程软件开发商
linux服务器磁盘型号
东营定制软件开发推荐
ip地址域名dns解析服务器
固原软件开发成交价
集群管理服务器软件
网络安全层次划分
网络安全法解读 人民网
神木市公安局网络安全规定
我的世界服务器防炸服编码
数据库的恢复可分为哪几类
自考数据库安全性是指什么
柯美6000服务器无法连接
保护数据库安全的措施有哪些
关系数据库连接算法
安装程序数据库无效
网络安全新技术对疫情的应用
mavenweb连接数据库
浙江软件开发价格多少
数据库模式又叫