【SSH三大框架】Hibernate基础第十一篇:对继承映射的操作
在java中。类之间能够有继承关系。可是在数据库中是没有继承关系的。只是Hibernate是为了把面向对象的关系反映到数据库中。Hibernate为我们提供了3种方案:
第一、一个继承体系放在一张表中(就是把父类与子类的全部属性反映在一张表中)
第二、每一个子类映射一张表,然后与父类相应的表用主键一对一关联起来
第三、每一个详细类映射一张表
我们如果有三个类:Employee(员工)、Skill(技术)、Sales(销售)
员工分为技术人员和销售人员两种类型,技术和销售类继承员工类:
Employee.java:
private String id;
private String name;
private Department depart;
Skill.java:
private String skill; //定义技术类型
Sales.java:
private int sell; //定义销售数量
第一种:一个继承体系放在一张表中
(用绘图画的,没用Rose。可能不是太好看。见谅了)
在这上边,我们把三个类映射在了一张表:Employee上边,我们看一下Employee.hbm.xml:
<? xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
package="cn.itcast.hibernate.domain">
<class name="Employee" discriminator-value="0">
<id name="id">
<generator class="uuid"/>
</id>
<discriminator column="type" type="int" />
<property name="name" />
<many-to-one name="depart" column="depart_id" />
<subclass name="Skill" discriminator-value="1">
<property name="skill" />
</subclass>
<subclass name="Sales" discriminator-value="2">
<property name="sell" />
</subclass>
</class> </hibernate-mapping>
我们在<class>标签中定义discriminator-value="0"这种字段用来差别记录的属性,然后我们添加了一个标签<discriminator column="type" type="int" />,意思是这个字段在数据库中映射为type列,类型为int。然后我们用了两个<subclass>标签定义了两个继承关系,当中的<property>是每一个继承类的对象,name属性会映射在数据库中成为相应的列。
我们写一个測试类:Many2OneExtend.java
public class Many2OneExtend {
public static void main(String[] args) {
add();
}
static void add(){
Session s = null;
Transaction tx = null;
try{
Employee emp1 = new Employee();
emp1.setName("emp1 name");
Sales emp2 = new Sales();
emp2.setName("emp2 name");
emp2.setSell(100);
Skill emp3 = new Skill();
emp3.setName("emp3 name");
emp3.setSkill("我是做java开发的");
s = HibernateUtil.getSession();
tx = s.beginTransaction();
s.save(emp1);
s.save(emp2);
s.save(emp3);
tx.commit();
}finally{
if(s!=null){
s.close();
}
}
}
}
然后我们查看下数据库中的Employee的表:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDgwMDUzMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
能够看到。三个类都是已经映射在了一张表中。
第二、每一个子类映射一张表,然后与父类相应的表用主键一对一关联起来
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDgwMDUzMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
首先,我们在Sales.java和Skill.java两个类中添加一个属性:
private String id;
然后,我们编辑Employee.hbm.xml文件:
<? xml version="1.0"? >
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
package="cn.itcast.hibernate.domain">
<class name="Employee" >
<id name="id">
<generator class="uuid"/>
</id>
<property name="name" />
<many-to-one name="depart" column="depart_id" /> <joined-subclass name="Skill" >
<key column="id" />
<property name="skill" column="skill" type="string"></property>
</joined-subclass>
<joined-subclass name="Sales">
<key column="id" />
<property name="sell" type="integer"></property>
</joined-subclass>
</class> </hibernate-mapping>
这里我们採用的是<joined-subclass>标签
我们写一个測试类执行一下:Many2OneExtend
package cn.itcast.hibernate; import java.util.HashSet;
import java.util.Set; import org.hibernate.Session;
import org.hibernate.Transaction; import cn.itcast.hibernate.domain.Employee;
import cn.itcast.hibernate.domain.Sales;
import cn.itcast.hibernate.domain.Skill; public class Many2OneExtend {
public static void main(String[] args) {
add();
}
static void add(){
Session s = null;
Transaction tx = null; try{
Employee emp1 = new Employee();
emp1.setName("emp1 name"); Sales emp2 = new Sales();
emp2.setName("emp2 name");
emp2.setSell(100); Skill emp3 = new Skill();
emp3.setName("emp3 name");
emp3.setSkill("我是做java开发的"); s = HibernateUtil.getSession();
tx = s.beginTransaction(); s.save(emp1);
s.save(emp2);
s.save(emp3);
tx.commit(); }finally{
if(s!=null){
s.close();
}
}
}
}
然后,我们查看一下三张数据库表的情况:
第三、每一个详细类映射一张表
在这样的情况下。Employee类被看做一个抽象的类。Sales和Skill类继承Employee的全部属性。所以最后仅仅会有Sales和Skill表,没有Employee表。
下边我们看一下Employee.hbm.xml文件:
<?xml version="1.0"? >
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
package="cn.itcast.hibernate.domain">
<class name="Employee" abstract="true">
<id name="id">
<generator class="uuid"/>
</id>
<property name="name" />
<many-to-one name="depart" column="depart_id" />
</class> <union-subclass name="Skill" extends="Employee">
<property name="skill" column="skill" type="string"></property>
</union-subclass>
<union-subclass name="Sales" extends="Employee">
<property name="sell" type="integer"></property>
</union-subclass> </hibernate-mapping>
在这里边。我们的<class>标签定义了一个属性:abstract="true",设置这个类是抽象的。
在<class></class>标签之外,我们定义了两对<union-subclass></union-subclass>标签。这两对标签定义了两个继承类。
我们写一下測试文件:Many2OneExtend.java
public class Many2OneExtend {
public static void main(String[] args) {
add();
}
static void add(){
Session s = null;
Transaction tx = null;
try{
Sales emp2 = new Sales();
emp2.setName("emp2 name");
emp2.setSell(100);
Skill emp3 = new Skill();
emp3.setName("emp3 name");
emp3.setSkill("我是做java开发的");
s = HibernateUtil.getSession();
tx = s.beginTransaction();
s.save(emp2);
s.save(emp3);
tx.commit();
}finally{
if(s!=null){
s.close();
}
}
}
}
然后。我们看一下数据库中的表:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDgwMDUzMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
能够看到,我们只得到了两个表:Skill表和Sales表
【SSH三大框架】Hibernate基础第十一篇:对继承映射的操作的更多相关文章
- eclipse中SSH三大框架环境搭建<三>
相关链接: eclipse中SSH三大框架环境搭建<一> eclipse中SSH三大框架环境搭建<二> 引言:通过上两篇文章我们已经可以掌握struts2和spring的环境的 ...
- ssh三大框架的认识
一.SSH三大框架的概述 ssh为 struts+spring+hibernate的一个集成框架,是目前较流行的一种Web应用程序开源框架. 集成SSH框架的系统从职责上分为四层:表示层.业务逻辑层 ...
- eclipse中SSH三大框架环境搭建<二>
通过上一篇博客我们可以轻松搭建strtus2的环境,接下来由我来继续介绍spring的环境搭建以及spring注入的简单使用 相关链接:eclipse中SSH三大k框架环境搭建<一> ec ...
- eclipse中SSH三大框架环境搭建<一>
这里先简单介绍一下我用的三大框架版本以及下载地址 相关链接:eclipse中SSH三大框架环境搭建<二> eclipse中SSH三大框架环境搭建<三> struts-2.3.3 ...
- SSH三大框架合辑的搭建步骤
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- SSH三大框架整合案例
SSH三大框架的整合 SSH三个框架的知识点 一.Hibernate框架 1. Hibernate的核心配置文件 1.1 数据库信息.连接池配置 1.2 Hibernate信息 1.3 映射配置 ...
- SSH三大框架的整合
SSH三个框架的知识点 一.Hibernate框架 1. Hibernate的核心配置文件 1.1 数据库信息.连接池配置 1.2 Hibernate信息 1.3 映射配置 1.4 Hibernate ...
- Maven SSH三大框架整合的加载流程
<Maven精品教程视频\day02视频\03ssh配置文件加载过程.avi;> 此课程中讲 SSH三大框架整合的加载流程,还可以,初步接触的朋友可以听一听. < \day02视频\ ...
- JavaWeb_(SSH)三大框架整合struts+hibernate+spring_Demo
三大框架整合 一.SSH导包 二.书写Spring 三.书写Struts 四.整合Spring与Struts 五.书写(与整合)Hibernate.引入c3p0连接池并使用hibernate模板 六. ...
随机推荐
- Java I/O学习
转载: Java I/O学习 一.Java I/O类结构以及流的基本概念 在阅读Java I/O的实例之前我们必须清楚一些概念,我们先看看Java I/O的类结构图: Java I/O主要以流的形式进 ...
- Vsftpd支持SSL加密传输
ftp传输数据是明文,弄个抓包软件就可以通过数据包来分析到账号和密码,为了搭建一个安全性比较高ftp,可以结合SSL来解决问题 SSL(Secure Socket Layer)工作于传输层和应用程 ...
- Ngnix的日志管理和用定时任务完成日志切割
一.日志管理 先来看看ngnix的配置文件的server段 接下来我们解释一下默认格式的具体意思 #log_format main '$remote_addr(远程IP) - $remote_user ...
- poj2485(Kruskal)
这道题显然是一道最小生成树的问题,参考算法导论中的Kruskal方法,先对路径长度进行排序,然后使用并查集(Disjoint Set Union)来判断节点是否连通,记录连接所有节点的最后一条路径的长 ...
- linux下如何配置TCP参数设置详解
设置tcp参数一定要小心谨慎,轻易不要更改线上环境,我贴一下我们线上环境中,sysctl.conf的内容,见文章底部 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tc ...
- python魔法方法-自定义序列详解
自定义序列的相关魔法方法允许我们自己创建的类拥有序列的特性,让其使用起来就像 python 的内置序列(dict,tuple,list,string等). 如果要实现这个功能,就要遵循 python ...
- Python协程(下)
停止子线程 如果一切正常,那么上面的例子很完美.可是,需要停止程序,直接ctrl+c,会抛出KeyboardInterrupt错误,我们修改一下主循环: try: while True: task = ...
- 【BZOJ 4171】 4171: Rhl的游戏 (高斯消元)
4171: Rhl的游戏 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 74 Solved: 33[Submit][Status][Discuss] ...
- 【贪心+Treap】BZOJ1691-[Usaco2007 Dec]挑剔的美食家
[题目大意] 有n头奶牛m种牧草,每种牧草有它的价格和鲜嫩度.每头奶牛要求它的牧草的鲜嫩度要不低于一个值,价格也不低于一个值.每种牧草只会被一头牛选择.问最少要多少钱? [思路] 显然的贪心,把奶牛和 ...
- [CodeForces-763C]Timofey and remoduling
题目大意: 告诉你一个长度为n的等差数列在模m意义下的乱序值(互不相等),问是否真的存在满足条件的等差数列,并尝试构造任意一个这样的数列. 思路: 首先我们可以有一个结论: 两个等差数列相等,当且仅当 ...