(14)Hibernate继承映射
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,人们总是在失去时,才了解到事情的本质需求:动物、猫、猴子1、简单继承映射Animal.javapackage com.rk.hibernate.n_inheritance1;public abstra
千家信息网最后更新 2025年02月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"); Listlist = 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安全错误
数据库的锁怎样保障安全
常用的软件开发外包
无线网络技术截图
七日杀服务器坏档
雅芳软件开发系统
冰山服务器
服务器管理器无法加载服务列表
网页放到腾讯云服务器
网络安全技能竞赛决赛题目
母婴网络安全法
乌班图服务器如何安装mysql
仪器开发和软件开发哪个难
医疗大健康与数据库技术
软件开发高新账务
数据库技术的发展进程
网络安全画画手抄报
服务器影子账号
数据库两张表having
软件开发中的最大问题是
养鸡数据库
青岛蓝恩网络技术
u2 接口硬盘怎么上华为服务器
国家电网全员网络安全考试
药物相关生信数据库
重庆嵌入式软件开发大概多少钱
清镇市网络安全
台州椒江区高端软件开发地址
视频网站服务器带宽多少
网站登录密码存储数据库哪里
手机玩游戏连接不上服务器有流量
计算机网络技术考试二建吗