Hibernate中类的继承联合使用subclass和join
类和表的关系:
单独使用<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相关推荐
- 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: 脂肪是对人体不好的营养素 答: ...
- hibernate的多表联合查询
SQL多表联合查询的知识点回顾 /*连接查询 * 交叉连接:交叉连接返回的结果是被连接的两个表中所有数据行的笛卡尔积,也就是返回第一个 * 表中付汇查询条件的数据行乘以第二个表中符 ...
- 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 ...
最新文章
- 点云深度学习的Pytorch框架
- 【Java】7.1 与用户互动 7.2 系统相关
- iis服务器怎样配置多张证书,IIS配置多个ssl怎么做?怎么配置?
- boost::safe_numerics模块实现数据类型下溢的测试程序
- 创建一个Business partner reference extension field
- PS把一张白色背景的图片设为透明
- python 中BeautifulSoup入门
- I Hate It(HDU-1754)
- 用Dalvik指令集写个java类
- init 0-6 这几个启动级别都代表什么意思
- 【Java从0到架构师】Zookeeper - 安装、核心工作机制、基本命令
- Deep Graph Library消息传递机制-Message Passing详解
- 【Android笔记】Android引用第三方依赖包library报错解决方法
- 用imspost制作catia后处理_为什么我推荐你用3D打印技术制造模具?
- 2019下半年计算机二级c语言,2019年下半年计算机二级C语言试题(4)
- vue通过子组件修改父组件prop的几种实现方式
- 什么行业需要用到高防服务器呢?高防服务器又有什么用?
- FigDraw 20. SCI文章中绘图之马赛克图 (mosaic)
- 国内列为一级学报的期刊
- Matlab2013a学习之男女的声音识别