在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. 关于 DP 的一些题目

    DP 是真的好玩. 口胡一段话题解: DP 题集 1 DP 题集 2

  2. HDU 1880 简单Hash

    题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=1880] 中文题面,题意很简单: 题解: 把每个 魔咒 和 对应的功能分别Hash,然后分别映射到ma ...

  3. 解决关于stack溢出的问题

    开发中经常遇到: 前端遇到Uncaught RangeError: Maximum call stack size exceeded错误 后台遇到java.lang.OutOfMemoryError: ...

  4. Android:Date、String、Long三种日期类型之间的相互转换

    源地址:http://blog.csdn.net/wangyanguiyiyang date类型转换为String类型: // formatType格式为yyyy-MM-dd HH:mm:ss//yy ...

  5. C# 基于正则表达式的字符串验证

    输入的字符串校验,是开发中经常遇到的问题,常用的办法是利用正则表达式进行判断.其特点是简洁有效. 1.正则表达基础知识 正则表达式的教程很多,这里两个基础教程: a.http://www.cnblog ...

  6. Shell基础学习(七) 输入输出重定向

    命令 说明 command>file 将输出重定向到file command<file 将输入重定向到file command >> file 将输出追加到file n > ...

  7. 【原】Eclipse部署Maven web项目到tomcat服务器时,没有将lib下的jar复制过去的解决办法

    我们在做web开发是,经常都要在eclipse中搭建web服务器,并将开发中的web项目部署到web服务器进行调试,在此,我选择的是tomcat服务器.之前部署web项目到tomcat进行启动调试都很 ...

  8. HDU 1171 Big Event in HDU (多重背包变形)

    Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  9. DTCC:MySQl核心代码开发经验揭示

    http://tech.it168.com/a2012/0413/1337/000001337236.shtml

  10. java socket 长连接 短连接

    长连接 是一旦一个客户端登陆上服务器,其与服务器之间的连接就不关闭,不管他们之间进行了多少次交易,直到客户端退出登陆或网络出现故障.这种技术在联机交易系统实现有利于提高效率. 短连接是客户端每发一个请 ...