类和表的关系:

单独使用<subclass/>元素的类会和父类在同一张表里;

使用<subclass><join></join></subclass>这两个元素的类会单独占一个表。


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

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" discriminator-value="0"><id name="id" column="EMPLOYEE_ID"><generator class="native" /></id><discriminator column="type" type="int" force="false" /><property name="name" column="EMPLOYEE_NAME" /><subclass name="Sale" discriminator-value="1"><property name="sell" column="SELL"/></subclass><subclass name="Skill" discriminator-value="2"><join table="skill" ><key column="id" /><property name="skiller" column="SKILLER"/></join></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/unionextend</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();}}}
}


生成的表结构:

employees

skill



插入语句:

Sale
Hibernate: insert into employees (EMPLOYEE_NAME, SELL, type) values (?, ?, 1)

Skill
Hibernate: insert into employees (EMPLOYEE_NAME, type) values (?, 2)
Hibernate: insert into skill (SKILLER, id) values (?, ?)

Employee
Hibernate: insert into employees (EMPLOYEE_NAME, type) values (?, 0)

查询语句:
Hibernate:
select
sale0_.EMPLOYEE_ID as EMPLOYEE1_0_0_,
sale0_.EMPLOYEE_NAME as EMPLOYEE3_0_0_,
sale0_.SELL as SELL0_0_
from employees sale0_
where sale0_.EMPLOYEE_ID=? and sale0_.type=1

Hibernate:
select skill0_.EMPLOYEE_ID as EMPLOYEE1_0_0_,
skill0_.EMPLOYEE_NAME as EMPLOYEE3_0_0_,
skill0_1_.SKILLER as SKILLER1_0_
from employees skill0_
inner join skill skill0_1_
on skill0_.EMPLOYEE_ID=skill0_1_.id
where skill0_.EMPLOYEE_ID=? and skill0_.type=2

Hibernate:
select employee0_.EMPLOYEE_ID as EMPLOYEE1_0_0_,
employee0_.EMPLOYEE_NAME as EMPLOYEE3_0_0_,
employee0_.SELL as SELL0_0_,
employee0_1_.SKILLER as SKILLER1_0_,
employee0_.type as type0_0_
from employees employee0_
left outer join skill employee0_1_
on employee0_.EMPLOYEE_ID=employee0_1_.id
where employee0_.EMPLOYEE_ID=?

查询结果:
Sale{id=1, name=sunliu, sell=300000}
Skill{id=2, name=wangwu, skiller=java}

Employee{id=3, name=lisi}

PS:这样联合使用subclass和join的好处是结合了单独使用subclass的高效率和joined-subclass的对于关系模型的理念。如果类的属性比较多则用join,如果属性少则直接用subclass即可(指用本案例的模型)。

转载于:https://www.cnblogs.com/xzf007/archive/2012/08/27/2873809.html

Hibernate中类的继承联合使用subclass和join相关推荐

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

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

  2. python类与继承person类_关于python中类的继承及self

    关于python中类的继承及self 如下,如果调用student类,则可以正常运行,但是如果去掉consumer.__init__(self, fee)中的self,将其改成consumer.__i ...

  3. python类方法继承_对python中类的继承与方法重写介绍

    1.单继承 父类也叫基类 子类也叫派生类 如下所示,继承的关系: 继承的书写格式: class 子类(父类): 方法 实例: class Animal: def eat(self): print(&q ...

  4. python3类的继承详解_python3中类的继承以及self和super的区别详解

    python中类的继承: 子类继承父类,及子类拥有了父类的 属性 和 方法. python中类的初始化都是__init__().所以父类和子类的初始化方式都是__init__(),但是如果子类初始化时 ...

  5. python中类的继承关系使用什么符号表示_智慧职教: Python中类的继承关系使用( )符号表示?...

    智慧职教: Python中类的继承关系使用( )符号表示? 答:2, 芭娜娜频繁描写死亡的真正意图是什么?() 答:寻求走出死亡阴影,重获新生的途径 中国大学MOOC: 脂肪是对人体不好的营养素 答: ...

  6. hibernate的多表联合查询

    SQL多表联合查询的知识点回顾 /*连接查询      * 交叉连接:交叉连接返回的结果是被连接的两个表中所有数据行的笛卡尔积,也就是返回第一个      * 表中付汇查询条件的数据行乘以第二个表中符 ...

  7. java中的类的继承_再谈Java中类的继承

    上篇博客谈到了Java中类的继承,但是那些远远不能满足我们在实际操作中的需要,那么怎么才能让子类的功能更强大,并且具有父类的属性呢? 一: 父类 1 public classA {2 3 final ...

  8. python中类的继承规则

    python中类的继承规则 在学习python中的继承规则之前,首先要知道python中类的划分. 只要继承object类的就是新式类,不继承object类的都是经典类. 在python3中,所有的类 ...

  9. (8)hibernate四种继承映射

    一 一个类继承体系一张表 1 对象模型(java类结构) 2 映射后据库中的表 3 代码 Employee.java package com.learning;public class Employe ...

  10. Hibernate读书笔记---继承映射

    对于面向对象的程序设计语言,继承.多态是两个最基本的概念.Hibernate的继承映射可以理解两个持久化类之间的继承关系. Hibernate支持几种继承映射策略,不管哪种继承映射策略,Hiberna ...

最新文章

  1. 点云深度学习的Pytorch框架
  2. 【Java】7.1 与用户互动 7.2 系统相关
  3. iis服务器怎样配置多张证书,IIS配置多个ssl怎么做?怎么配置?
  4. boost::safe_numerics模块实现数据类型下溢的测试程序
  5. 创建一个Business partner reference extension field
  6. PS把一张白色背景的图片设为透明
  7. python 中BeautifulSoup入门
  8. I Hate It(HDU-1754)
  9. 用Dalvik指令集写个java类
  10. init 0-6 这几个启动级别都代表什么意思
  11. 【Java从0到架构师】Zookeeper - 安装、核心工作机制、基本命令
  12. Deep Graph Library消息传递机制-Message Passing详解
  13. 【Android笔记】Android引用第三方依赖包library报错解决方法
  14. 用imspost制作catia后处理_为什么我推荐你用3D打印技术制造模具?
  15. 2019下半年计算机二级c语言,2019年下半年计算机二级C语言试题(4)
  16. vue通过子组件修改父组件prop的几种实现方式
  17. 什么行业需要用到高防服务器呢?高防服务器又有什么用?
  18. FigDraw 20. SCI文章中绘图之马赛克图 (mosaic)
  19. 国内列为一级学报的期刊
  20. Matlab2013a学习之男女的声音识别

热门文章

  1. echarts 设置地图默认缩放比例 尺寸
  2. Win10账户已被锁定解决方法
  3. 2021最新前端面试题
  4. 计算机学科a类排名,哈工大17个学科排名位列A类
  5. 关于unity easy touch 再次进入场景后报错问题
  6. 中国目前拥有的人造卫星的种类及其作用
  7. C++PrimerPlus 第六章 分支语句和逻辑运算符 - 6.1 if语句
  8. 常用24位颜色表转换成16位颜色值,让16位lcd使用
  9. 树莓派教程(3)——树莓派设置中文
  10. 【学习强化学习】五、PPO算法原理及实现