类与表的关系:


*************

Employee.java

*************

package blog.hibernate.domain;public class Employee {private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Employee{" + "id=" + id + ", name=" + name + '}';}
}


*************

Sale.java

*************

package blog.hibernate.domain;public class Sale extends Employee {private int sell;public int getSell() {return sell;}public void setSell(int sell) {this.sell = sell;}@Overridepublic String toString() {return "Sale{"  + "id=" + this.getId() + ", name=" + this.getName() + "sell=" + sell + '}';}
}


*************

Skill.java

*************

package blog.hibernate.domain;public class Skill extends Employee{private String skiller;public String getSkiller() {return skiller;}public void setSkiller(String skiller) {this.skiller = skiller;}@Overridepublic String toString() {return "Skill{"  + "id=" + this.getId() + ", name=" + this.getName() + "skiller=" + skiller + '}';}
}


*************
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="blog.hibernate.domain"><class name="Employee" table="employees"><id name="id" column="EMPLOYEE_ID"><generator class="native" /></id><property name="name" column="EMPLOYEE_NAME" /><joined-subclass name="Sale" table="sale" ><key column="SALE_ID" /><property name="sell" column="SELL"/></joined-subclass><joined-subclass name="Skill" table="skill" ><key column="SKILL_ID" /><property name="skiller" column="SKILLER"/></joined-subclass></class>
</hibernate-mapping>


*******************
HibernateUtil.java

*******************

package blog.hibernate;import java.util.logging.Level;
import java.util.logging.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;public final class HibernateUtil {private static SessionFactory sessionFactory;private HibernateUtil(){}static{Configuration cfg = new Configuration();sessionFactory =  cfg.configure("hibernate.cfg.xml").buildSessionFactory();}public static SessionFactory getSessionFactory(){return sessionFactory;}public static Session getSession(){return sessionFactory.openSession();}


****************
hibernate.cfg.xml

***************

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/joinextend</property><!-- ///表示连接本机的数据库//localhost:3306 --><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">1234</property><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><property name="hibernate.hbm2ddl.auto">create</property><property name="hibernate.show_sql">true</property><mapping resource="blog/hibernate/domain/Employee.hbm.xml"/></session-factory>
</hibernate-configuration>


******************

junit test: JoinExtend.java

*******************

package junit.test;import java.util.logging.Logger;
import java.util.logging.Level;
import org.hibernate.Transaction;
import blog.hibernate.HibernateUtil;
import blog.hibernate.domain.Employee;
import blog.hibernate.domain.Sale;
import blog.hibernate.domain.Skill;
import org.hibernate.Session;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;public class JoinExtend {public JoinExtend() {}@BeforeClasspublic static void setUpClass() throws Exception {}@AfterClasspublic static void tearDownClass() throws Exception {}@Beforepublic void setUp() {}@Testpublic void test(){add();query();}public void add(){Employee emp1 = new Employee();emp1.setName("lisi");Skill emp2 = new Skill();emp2.setName("wangwu");emp2.setSkiller("java");Sale emp3 = new Sale();emp3.setName("sunliu");emp3.setSell(300000);Session session = null;Transaction tx = null;try {session = HibernateUtil.getSession();tx = session.beginTransaction();session.save(emp3);session.save(emp2);session.save(emp1);tx.commit();} catch (Exception e) {Logger.getLogger(JoinExtend.class.getName()).log(Level.SEVERE, null, e);if (tx != null) {tx.rollback();}} finally {if (session != null) {session.close();}}}public void query(){Session session = null;try {session = HibernateUtil.getSession();Employee emp1 = (Employee)session.get(Sale.class, 1);Employee emp2 = (Employee)session.get(Skill.class, 2);Employee emp3 = (Employee)session.get(Employee.class, 3);System.out.println(emp1.toString());System.out.println(emp2.toString());System.out.println(emp3.toString());} catch (Exception e) {Logger.getLogger(JoinExtend.class.getName()).log(Level.SEVERE, null, e);} finally {if (session != null) {session.close();}}}
}


用joined-class会生成三张表:

employees

sale

skill


Hibernate生成的sql语句为:

Hibernate: insert into employees (EMPLOYEE_NAME) values (?)
Hibernate: insert into sale (SELL, SALE_ID) values (?, ?)
Hibernate: insert into employees (EMPLOYEE_NAME) values (?)
Hibernate: insert into SKILL (SKILLER, SKILL_ID) values (?, ?)
Hibernate: insert into employees (EMPLOYEE_NAME) values (?)

Hibernate:
select
sale0_.SALE_ID as EMPLOYEE1_0_0_,
sale0_1_.EMPLOYEE_NAME as EMPLOYEE2_0_0_,
sale0_.SELL as SELL1_0_
from sale sale0_
inner join
employees sale0_1_
on
sale0_.SALE_ID=sale0_1_.EMPLOYEE_ID
where
sale0_.SALE_ID=?

Hibernate:
select
skill0_.SKILL_ID as EMPLOYEE1_0_0_,
skill0_1_.EMPLOYEE_NAME as EMPLOYEE2_0_0_,
skill0_.SKILLER as SKILLER2_0_
from SKILL skill0_
inner join
employees skill0_1_
on
skill0_.SKILL_ID=skill0_1_.EMPLOYEE_ID
where
skill0_.SKILL_ID=?

测试结果为:

Sale{id=1, name=sunliusell=300000}
Skill{id=2, name=wangwuskiller=java}
Employee{id=3, name=lisi}


Hibernate:
select
employee0_.EMPLOYEE_ID as EMPLOYEE1_0_0_,
employee0_.EMPLOYEE_NAME as EMPLOYEE2_0_0_,
employee0_1_.SELL as SELL1_0_,
employee0_2_.SKILLER as SKILLER2_0_,
case
when employee0_1_.SALE_ID is not null then 1
when employee0_2_.SKILL_ID is not null then 2
when employee0_.EMPLOYEE_ID is not null then 0
end
as clazz_0_
from
employees employee0_
left outer join
sale employee0_1_
on
employee0_.EMPLOYEE_ID=employee0_1_.SALE_ID
left outer join
SKILL employee0_2_
on
employee0_.EMPLOYEE_ID=employee0_2_.SKILL_ID
where
employee0_.EMPLOYEE_ID=?

PS:

采用这种方式的好处是数据库的表结构符合关系模型的设计理念,子类对应的字段可以强制为非空,如果要新增一个子类,只需要新增一个表即可;缺点是效率不高,而且表的个数比较多。

转载于:https://www.cnblogs.com/xzf007/archive/2012/08/26/2873810.html

Hibernate类的继承使用joined-class实现相关推荐

  1. Hibernate学习(3) (继承映射,配置文件和注解版)

    这篇blog准备写怎样在Hibernate中反应内存对象之间的继承关系.我们知道,内存对象之间是可以有继承关系的,但是在数据库中,我们继承神马的都是浮云,不存在的.那么怎么办呢?Hibernate提供 ...

  2. C++:随笔5---this指针和类的继承

    this指针:(通过一个典型的例子来认识他) class Human {char fishc;Human(char fishc);//构造函数}; Human::Human(char fishc)// ...

  3. 【廖雪峰python进阶笔记】类的继承

    1. 继承 如果已经定义了Person类,需要定义新的Student和Teacher类时,可以直接从Person类继承: class Person(object):def __init__(self, ...

  4. LotusScript类的继承

    最近在修改产品时,时常遇到需要修改一个自定义类的方法,但是这个类又不能给整个(代码保密),这时如何调试就变得很麻烦了.下面通过类的继承就可以很方便的解决这个问题了. Option PublicClas ...

  5. java类接口实验_实验3_Java类的继承和接口的定义和使用

    本次有三题:学会Java类的继承.接口的定义和使用 // Ex3_1.java /** * 题目要求: * 修改例5.7(P95)实现在页面中拖动鼠标画出矩形,矩形的对角线为点击并拖动鼠标形成的直线线 ...

  6. python 类的继承,类中的函数调用以及类输入数组

    第一部分,类的继承 先给出一个例子: class People(): #定义类,要大写,python 2中要在括号里加如object这个单词def __init__(self,n,a,w): #定义一 ...

  7. python 笔记 之 类的继承与重写

    2019独角兽企业重金招聘Python工程师标准>>> ''' 6.继承 super 重写 调用:先找子类中的方法,如果子类中找不到就到父类中找 多继承:如果父类中都有该方法,那么先 ...

  8. python中的继承有什么特点_python类的继承是什么?类的继承有什么样的规则?

    在这篇文章之中我们来了解一下python类的继承,对于刚刚接触到python这一编程语言的朋友来说,对于python类的继承的了解应该比较少,不过没关系,在接下来的文章之中我们就来了解一下python ...

  9. C++知识点44——类的继承概述

    类的继承,是新类从已有类那里得到已有的特性,或从已有类产生新类的过程.原有类称为基类或父类,新类称为派生类或子类. 子类通过类派生列表确定子类继承了哪些类.类派生列表的形式如下 class 子类名:访 ...

  10. python3 入门 (四) 类与继承

    Python 类 Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法. 对象可以包含任意数量和类型的数据. p ...

最新文章

  1. CMRNet++:一种相机在激光雷达构建地图中的定位方案
  2. 当AI实现多任务学习,它究竟能做什么?
  3. struts+spring+hibernate总结
  4. Mysql忘记用户密码的解决办法
  5. 中国计算机学会CCF推荐国际学术会议和期刊目录-交叉/综合/新兴
  6. 怎么才能学好ajax,ajax - 如何学好java - BlogJava
  7. python 内存数据库下载,Python 文件存储和数据库
  8. 文件服务器+快照恢复,云服务器快照恢复
  9. 数据科学包10-pandas高级内容之时间序列
  10. Atitit webshell java 实现 命令行输出读取问题总结 1.1. 读取组赛 或者读取了一部分。。使用cmd /c 模式,强制关闭刷新缓冲区 1 1.2. 乱码解决 1 1.3. /h
  11. SQL Server 2005两种快照隔离机制的比较
  12. 软件测试测试工具总结
  13. 华为 USG6000防火墙管理员密码重置(配置会清空)
  14. easyui基本布局
  15. 集群资源调度系统设计架构总结
  16. 量化交易策略五_PEG策略
  17. Imbalance data——数据不平衡问题
  18. SAP ABAP 系列丛书推荐:PP 报工
  19. java常见的密码加密方式base64,Sha256,MD5
  20. IText生成PDF

热门文章

  1. java 视频提取音频 | Java工具类
  2. 以赛促产 以赛引才 |第六届世界智能大会·中国华录杯数据湖算法大赛正式启动
  3. 屎上最详细最生动的TFT液晶显示屏原理介绍
  4. 区块链开发基础知识学习
  5. 5.3 使用数据结构对真实世界建模
  6. 杭州电子科技大学计算机考研录取名单,杭州电子科技大学2017年硕士研究生一志愿考生复试名单公布...
  7. java鼠标乱跑_光标乱跑怎么办 光标乱跑解决方法【图文】
  8. Myeclipse中编辑Jsp时解决光标乱跑的方法
  9. 修复苹果电脑运行过程中出现的声音、触摸板失灵、键盘错键、光标乱窜问题
  10. 数字舵机和模拟舵机的区别