在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基础第十一篇:对继承映射的操作的更多相关文章

  1. eclipse中SSH三大框架环境搭建<三>

    相关链接: eclipse中SSH三大框架环境搭建<一> eclipse中SSH三大框架环境搭建<二> 引言:通过上两篇文章我们已经可以掌握struts2和spring的环境的 ...

  2. ssh三大框架的认识

    一.SSH三大框架的概述 ssh为 struts+spring+hibernate的一个集成框架,是目前较流行的一种Web应用程序开源框架.  集成SSH框架的系统从职责上分为四层:表示层.业务逻辑层 ...

  3. eclipse中SSH三大框架环境搭建<二>

    通过上一篇博客我们可以轻松搭建strtus2的环境,接下来由我来继续介绍spring的环境搭建以及spring注入的简单使用 相关链接:eclipse中SSH三大k框架环境搭建<一> ec ...

  4. eclipse中SSH三大框架环境搭建<一>

    这里先简单介绍一下我用的三大框架版本以及下载地址 相关链接:eclipse中SSH三大框架环境搭建<二> eclipse中SSH三大框架环境搭建<三> struts-2.3.3 ...

  5. SSH三大框架合辑的搭建步骤

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  6. SSH三大框架整合案例

    SSH三大框架的整合   SSH三个框架的知识点 一.Hibernate框架 1. Hibernate的核心配置文件 1.1 数据库信息.连接池配置 1.2 Hibernate信息 1.3 映射配置 ...

  7. SSH三大框架的整合

    SSH三个框架的知识点 一.Hibernate框架 1. Hibernate的核心配置文件 1.1 数据库信息.连接池配置 1.2 Hibernate信息 1.3 映射配置 1.4 Hibernate ...

  8. Maven SSH三大框架整合的加载流程

    <Maven精品教程视频\day02视频\03ssh配置文件加载过程.avi;> 此课程中讲 SSH三大框架整合的加载流程,还可以,初步接触的朋友可以听一听. < \day02视频\ ...

  9. JavaWeb_(SSH)三大框架整合struts+hibernate+spring_Demo

    三大框架整合 一.SSH导包 二.书写Spring 三.书写Struts 四.整合Spring与Struts 五.书写(与整合)Hibernate.引入c3p0连接池并使用hibernate模板 六. ...

随机推荐

  1. Java I/O学习

    转载: Java I/O学习 一.Java I/O类结构以及流的基本概念 在阅读Java I/O的实例之前我们必须清楚一些概念,我们先看看Java I/O的类结构图: Java I/O主要以流的形式进 ...

  2. Vsftpd支持SSL加密传输

    ftp传输数据是明文,弄个抓包软件就可以通过数据包来分析到账号和密码,为了搭建一个安全性比较高ftp,可以结合SSL来解决问题   SSL(Secure Socket Layer)工作于传输层和应用程 ...

  3. Ngnix的日志管理和用定时任务完成日志切割

    一.日志管理 先来看看ngnix的配置文件的server段 接下来我们解释一下默认格式的具体意思 #log_format main '$remote_addr(远程IP) - $remote_user ...

  4. poj2485(Kruskal)

    这道题显然是一道最小生成树的问题,参考算法导论中的Kruskal方法,先对路径长度进行排序,然后使用并查集(Disjoint Set Union)来判断节点是否连通,记录连接所有节点的最后一条路径的长 ...

  5. linux下如何配置TCP参数设置详解

    设置tcp参数一定要小心谨慎,轻易不要更改线上环境,我贴一下我们线上环境中,sysctl.conf的内容,见文章底部 net.ipv4.tcp_tw_reuse    = 1  net.ipv4.tc ...

  6. python魔法方法-自定义序列详解

    自定义序列的相关魔法方法允许我们自己创建的类拥有序列的特性,让其使用起来就像 python 的内置序列(dict,tuple,list,string等). 如果要实现这个功能,就要遵循 python ...

  7. Python协程(下)

    停止子线程 如果一切正常,那么上面的例子很完美.可是,需要停止程序,直接ctrl+c,会抛出KeyboardInterrupt错误,我们修改一下主循环: try: while True: task = ...

  8. 【BZOJ 4171】 4171: Rhl的游戏 (高斯消元)

    4171: Rhl的游戏 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 74  Solved: 33[Submit][Status][Discuss] ...

  9. 【贪心+Treap】BZOJ1691-[Usaco2007 Dec]挑剔的美食家

    [题目大意] 有n头奶牛m种牧草,每种牧草有它的价格和鲜嫩度.每头奶牛要求它的牧草的鲜嫩度要不低于一个值,价格也不低于一个值.每种牧草只会被一头牛选择.问最少要多少钱? [思路] 显然的贪心,把奶牛和 ...

  10. [CodeForces-763C]Timofey and remoduling

    题目大意: 告诉你一个长度为n的等差数列在模m意义下的乱序值(互不相等),问是否真的存在满足条件的等差数列,并尝试构造任意一个这样的数列. 思路: 首先我们可以有一个结论: 两个等差数列相等,当且仅当 ...