在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. mysql 事务回滚

    begindeclare t_error integer default 0;  //添加变量t_error并赋初始值为0declare continue handler for sqlexcepti ...

  2. 洛谷P1486 [NOI2004]郁闷的出纳员 [STL,平衡树]

    题目传送门 郁闷的出纳员 题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反 ...

  3. 【UOJ #103】【APIO 2014】Palindromes

    http://uoj.ac/problem/103 由manacher得:本质不同的回文串只有\(O(n)\)个. 用manacher求出所有本质不同的回文串,对每个本质不同的回文串,在后缀自动机的p ...

  4. [BZOJ4260]Codechef REBXOR(Trie)

    Trie模板题.求出每个前缀和后缀的最大异或和区间,枚举断点就可.不知为何跑得飞快. #include<cstdio> #include<cstring> #include&l ...

  5. POJ1741 Tree 树分治模板

    http://poj.org/problem?id=1741   题意:一棵n个点的树,每条边有距离v,求该树中距离小于等于k的点的对数.   dis[y]表示点y到根x的距离,v代表根到子树根的距离 ...

  6. 【期望DP】BZOJ2318-[Spoj4060]Game with probability Problem

    [题目大意] Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬币,如果正面朝上,则从n个石子中取出一个石子,否则不做任何事.取到最后一颗石子的人胜利.Alice在投掷硬币 ...

  7. OpenSSL Heartbleed “心脏滴血”漏洞简单攻击示例

    OpenSSL Heartbleed漏洞的公开和流行让许多人兴奋了一把,也让另一些人惊慌了一把. 单纯从攻击的角度讲,我已知道的,网上公开的扫描工具有: 1.  Nmap脚本ssl-heartblee ...

  8. 较有意思的Apple XSS(CVE-2016-7762)漏洞

    文章作者:Avfisher0x00 前言应CVE作者的要求帮忙分析一下这个漏洞,实际上这是一个思路比较有意思的Apple XSS(CVE-2016-7762).漏洞作者确实脑洞比较大也善于尝试和发掘, ...

  9. hdu 3681 压缩dp+搜索

    题意:一个机器人想越狱,他只能带一定电量的电池,'S'表示道路可行,'G'表示充电器, 只可充电一次,但是可以经过很多次.'F'表示起点,'Y'表示要破坏的机关,也是只能破坏一次,但是可以经过无数次. ...

  10. hdu 4352 数位dp+nlogn的LIS

    题意:求区间L到R之间的数A满足A的的数位的最长递增序列的长度为K的数的个数. 链接:点我 该题的关键是记录LIS的状态,学习过nlogn解法的同学都知道,我们每次加入的元素要和前面的比对替换,这里就 ...