在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. U3D 基础

    千里之行,始于足下! 最先执行的方法是:1.(激活时的初始代码)Awake2.Start3.Update(FixUpdate,LateUpdate)4.渲染模块(OnGUI)5.再向后,就是卸载模块( ...

  2. 使用FlashPaper在线转换.doc为.swf_实用技巧

    https://yq.aliyun.com/ziliao/160044?spm=5176.8246799.0.0.JBbqjY 摘要: 本文讲的是使用FlashPaper在线转换.doc为.swf_实 ...

  3. Android中由Handler和内部类引起的内存泄漏

    原文地址:http://johnnyshieh.github.io/android/2015/09/03/android-handler-memory-leak/ 在Android中我们经常用Hand ...

  4. 基于libevent和unix domain socket的本地server

    https://www.pacificsimplicity.ca/blog/libevent-echo-server-tutorial 根据这一篇写一个最简单的demo.然后开始写client. cl ...

  5. Arduino可穿戴教程之第一个程序——选择端口(三)

    Arduino可穿戴教程之第一个程序——选择端口(三) 2.4.4  选择端口 在选择了板子之后,我们就需要选择板子连接到电脑的端口了.它也在“工具”菜单中设置,如图2.42所示. 注意:COM1端口 ...

  6. 使用matplotlib绘图(四)之散点图

    # 使用matplotlib绘制散点图 import numpy as np import matplotlib.pyplot as plt # 设置全局刻度标签大小 plt.rcParams['xt ...

  7. QT学习笔记1:VS2015配置QT5.11

    由于工作关系,我又接触到了QT,在之前写过一篇博客是 在vs2017下配置openCV,当时用的是2015做的示范,现在就继续记录一下在VS2015下配置QT吧(VS2017配置是一样的) 第一部分: ...

  8. BZOJ 3231: [Sdoi2008]递归数列 (JZYZOJ 1353) 矩阵快速幂

    http://www.lydsy.com/JudgeOnline/problem.php?id=3231   和斐波那契一个道理在最后加一个求和即可 #include<cstdio> #i ...

  9. Laravel输出JSON时设定输出字段的几种情况总结

    1.如果输出json的时候需要屏蔽某些字段,或则想自定义显示的字段: 1.model里面设置 protected $hidden = ['password'];//要屏蔽的字段 2.model里面设置 ...

  10. bzoj 4780: [Usaco2017 Open]Modern Art 2

    4780: [Usaco2017 Open]Modern Art 2 Time Limit: 10 Sec  Memory Limit: 128 MB Description Having becom ...