类与表的关系:


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

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"><property name="skiller" column="SKILLER"/></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/extend</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: Extend.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 Extend {public Extend() {}@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(Extend.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(Extend.class.getName()).log(Level.SEVERE, null, e);} finally {if (session != null) {session.close();}}}
}


用subclass只会生成一张表,表的结构为:

CREATE TABLE `employees` (
  `EMPLOYEE_ID` int(11) NOT NULL auto_increment,
  `type` int(11) NOT NULL,
  `EMPLOYEE_NAME` varchar(255) collate utf8_unicode_ci default NULL,
  `SELL` int(11) default NULL,
  `SKILLER` varchar(255) collate utf8_unicode_ci default NULL,
  PRIMARY KEY  (`EMPLOYEE_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

employees


Hibernate生成的sql语句为:

Hibernate: insert into employees (EMPLOYEE_NAME, SELL, type) values (?, ?, 1)
Hibernate: insert into employees (EMPLOYEE_NAME, SKILLER, type) values (?, ?, 2)
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_.SKILLER as SKILLER0_0_
from
employees skill0_
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_.SKILLER as SKILLER0_0_,
employee0_.type as type0_0_
from
employees employee0_
where
employee0_.EMPLOYEE_ID=?

测试结果为:

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

PS:

采用这种方式的好处是数据处理的效率高;缺点是数据库的表结构不符合关系模型的设计理念,而且子类对应的字段不能强制为非空,如果要新增一个子类那么就必须更改表的结构即新增一列。

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

Hibernate中类的继承使用subclass实现相关推荐

  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. java中的类的继承_再谈Java中类的继承

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

  7. python中类的继承规则

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

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

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

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

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

  10. python3中类的继承

    用简单的一句话来理解:继承,这样理解就对了,你的就是我的,但是我的还是我的,但是你有我也有的,我就不稀罕你的,所以调用了父类的时候,self就是我,而不是你 子类继承父类,即子类拥有了父类的属性和方法 ...

最新文章

  1. webkit webApp 开发技术要点总结
  2. JavaScript 实现 GriwView 单列全选
  3. 产品发布系统_【产品发布】第3期|阀门遥控系统
  4. php mysql开发技术_PHP+MySQL开发技术详解—学习笔记
  5. 查阅 arXiv 论文新神器,一行代码比较版本差别,Github 新开源!
  6. 无配置文件下使用log4net
  7. mysql 5.6.14 win7 32位免安装版配置_mysql 5.6.14 win7 32位免安装版配置
  8. 【电力负荷预测】基于matlab粒子群算法优化支持向量机预测电力负荷【含Matlab源码 1225期】
  9. python3 Excel转txt
  10. 英语发音规则---K字母
  11. 不可不会的「反转链表」问题
  12. OpenCV教程(5)函数整理
  13. 乘风破浪程序猿,拒绝原地踏步!
  14. 【论文阅读】TimbreTron : A WaveNet (Cycle GAN(CQT(audio ))) pipeline for musical timbre transfer
  15. 行为识别(CVPR2020南京大学腾讯) ~ TEA论文笔记 ~《TEA: Temporal Excitation and Aggregation for Action Recognition》
  16. 【8086汇编】DOS系统中 edit 文本编辑器详解
  17. linux rsync文件夹增量同步
  18. 计算机多媒体对语文教学的提高,终于懂了语文教学如何利用多媒体
  19. 雷军与周鸿祎:冥冥中的恩人与冤家
  20. ANSYS Maxwell导出图片的方法

热门文章

  1. 梨花风起正清明,清明习俗知多少?
  2. 对10G/40Gphy中auto-negotiation功能调试
  3. 图解HTTP读书笔记
  4. Quartus-II入门(全加器)
  5. C语言 定时器的原理,单片机定时器作用原理及学习应用详解
  6. ofo 成了一个披着「退押金」的电商导购平台?
  7. Pandas计算同比环比指标的3种方法
  8. 银行业务光凭“刷脸”真的靠谱吗
  9. 元宇宙构建基石:三维重建技术
  10. myd导入mysql_数据库是.frm,.myd,myi备份如何导入mysql