Hibernate中类的继承使用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"><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实现相关推荐
- Hibernate学习(3) (继承映射,配置文件和注解版)
这篇blog准备写怎样在Hibernate中反应内存对象之间的继承关系.我们知道,内存对象之间是可以有继承关系的,但是在数据库中,我们继承神马的都是浮云,不存在的.那么怎么办呢?Hibernate提供 ...
- python类与继承person类_关于python中类的继承及self
关于python中类的继承及self 如下,如果调用student类,则可以正常运行,但是如果去掉consumer.__init__(self, fee)中的self,将其改成consumer.__i ...
- python类方法继承_对python中类的继承与方法重写介绍
1.单继承 父类也叫基类 子类也叫派生类 如下所示,继承的关系: 继承的书写格式: class 子类(父类): 方法 实例: class Animal: def eat(self): print(&q ...
- python3类的继承详解_python3中类的继承以及self和super的区别详解
python中类的继承: 子类继承父类,及子类拥有了父类的 属性 和 方法. python中类的初始化都是__init__().所以父类和子类的初始化方式都是__init__(),但是如果子类初始化时 ...
- python中类的继承关系使用什么符号表示_智慧职教: Python中类的继承关系使用( )符号表示?...
智慧职教: Python中类的继承关系使用( )符号表示? 答:2, 芭娜娜频繁描写死亡的真正意图是什么?() 答:寻求走出死亡阴影,重获新生的途径 中国大学MOOC: 脂肪是对人体不好的营养素 答: ...
- java中的类的继承_再谈Java中类的继承
上篇博客谈到了Java中类的继承,但是那些远远不能满足我们在实际操作中的需要,那么怎么才能让子类的功能更强大,并且具有父类的属性呢? 一: 父类 1 public classA {2 3 final ...
- python中类的继承规则
python中类的继承规则 在学习python中的继承规则之前,首先要知道python中类的划分. 只要继承object类的就是新式类,不继承object类的都是经典类. 在python3中,所有的类 ...
- (8)hibernate四种继承映射
一 一个类继承体系一张表 1 对象模型(java类结构) 2 映射后据库中的表 3 代码 Employee.java package com.learning;public class Employe ...
- Hibernate读书笔记---继承映射
对于面向对象的程序设计语言,继承.多态是两个最基本的概念.Hibernate的继承映射可以理解两个持久化类之间的继承关系. Hibernate支持几种继承映射策略,不管哪种继承映射策略,Hiberna ...
- python3中类的继承
用简单的一句话来理解:继承,这样理解就对了,你的就是我的,但是我的还是我的,但是你有我也有的,我就不稀罕你的,所以调用了父类的时候,self就是我,而不是你 子类继承父类,即子类拥有了父类的属性和方法 ...
最新文章
- webkit webApp 开发技术要点总结
- JavaScript 实现 GriwView 单列全选
- 产品发布系统_【产品发布】第3期|阀门遥控系统
- php mysql开发技术_PHP+MySQL开发技术详解—学习笔记
- 查阅 arXiv 论文新神器,一行代码比较版本差别,Github 新开源!
- 无配置文件下使用log4net
- mysql 5.6.14 win7 32位免安装版配置_mysql 5.6.14 win7 32位免安装版配置
- 【电力负荷预测】基于matlab粒子群算法优化支持向量机预测电力负荷【含Matlab源码 1225期】
- python3 Excel转txt
- 英语发音规则---K字母
- 不可不会的「反转链表」问题
- OpenCV教程(5)函数整理
- 乘风破浪程序猿,拒绝原地踏步!
- 【论文阅读】TimbreTron : A WaveNet (Cycle GAN(CQT(audio ))) pipeline for musical timbre transfer
- 行为识别(CVPR2020南京大学腾讯) ~ TEA论文笔记 ~《TEA: Temporal Excitation and Aggregation for Action Recognition》
- 【8086汇编】DOS系统中 edit 文本编辑器详解
- linux rsync文件夹增量同步
- 计算机多媒体对语文教学的提高,终于懂了语文教学如何利用多媒体
- 雷军与周鸿祎:冥冥中的恩人与冤家
- ANSYS Maxwell导出图片的方法