(14)Hibernate继承映射
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,人们总是在失去时,才了解到事情的本质需求:动物、猫、猴子1、简单继承映射Animal.javapackage com.rk.hibernate.n_inheritance1;public abstra
千家信息网最后更新 2026年11月01日(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安全错误
数据库的锁怎样保障安全
耶加雪菲
鸠鸠互联网科技
互联网科技垄断
互联网金融 金融科技
互联网 科技创新
互联网科技博客
新华互联网科技2019
互联网科技教育视频
互联网科技革命什么开始
新兴科技互联网创新大赛颁奖典礼
搜狐科技互联网
链环科技传统企业怎么转型互联网
996高科技互联网公司
天津腾达互联网科技有限公司
浙南科技城互联网大厦建设工程
宁波跨境商互联网科技有限公司
科技互联网行业投资研究
版纳互联网科技选哪家
华人运通互联网科技公司
如何强化互联网金融科技
互联网品科技
港股互联网科技股
中国互联网科技发展
北京互联网络科技有限公司
山东吉时兔互联网科技有限公司
字节跳动和互联网科技
华夏恒生科技与互联网科技
互联网与数字科技关系
九思连强互联网电子科技有限公司
株洲百竞科技的互联网营销顾问