一个继承树一张表(subclass)
一个继承树一张表是指将一个类和他下面的所有派生类的所有的属性都放在一张表中,举例有Employee这个实体,在他下面分别派生了两个类skill和sell,通过Hibernate 通过subclass将Employee和他的派生类的所有属性都存放在一张表中,使用type区分类型:
hibernage.cfg.xml
<hibernate-configuration><session-factory name="sessionFactory"><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/spring?useUnicode=true&characterEncoding=UTF-8</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password"></property><property name="hibernate.show_sql">true</property><property name="hibernate.format_sql">true</property><property name="hibernate.hbm2ddl.auto">create</property><mapping resource="cn/hbm/Employee.hbm.xml" /></session-factory>
</hibernate-configuration>

实体:

public class Employee {private Integer id;private String name;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
public class Skiller extends Employee {private String skiller;public String getSkiller() {return skiller;}public void setSkiller(String skiller) {this.skiller = skiller;}}
public class Salesman extends Employee {private String salesman;public String getSalesman() {return salesman;}public void setSalesman(String salesman) {this.salesman = salesman;}}

hbm.xml:

<hibernate-mapping package="cn.model"><class name="Employee" table="EMPLOYEE" discriminator-value="0"><id name="id" column="ID"><generator class="native"></generator></id><discriminator column="type" type="int" /><property name="name" column="NAME" type="java.lang.String" unique="true" /><subclass name="Skiller" discriminator-value="1"><property name="skiller" /></subclass><subclass name="Salesman" discriminator-value="2"><property name="salesman" /></subclass></class>
</hibernate-mapping>

通过 discriminator-value="0"为其指定不同的类型;

public void saveEmployee(){Session session=null;Transaction tran=null;try{Employee e1=new Employee();e1.setName("Tom");Skiller e2=new Skiller();e2.setName("杰克");e2.setSkiller("skiller");Salesman e3=new Salesman();e3.setName("维丝");e3.setSalesman("salesman");session=HibernateSessionFactory.getSession();tran=session.beginTransaction();session.save(e1);session.save(e2);session.save(e3);tran.commit();}catch(Exception e){if(session!=null){session.close();}}}

在执行commit以后,Hibernate会生成相应的SQL,并且根据不同的类型为他的type填上不同的值:


每个类映射一张表(joined-subclass)

<hibernate-mapping package="cn.model"><class name="Employee" table="EMPLOYEE"><id name="id" column="ID"><generator class="native"></generator></id><property name="name" column="NAME" type="java.lang.String" unique="true" /><joined-subclass name="Skiller" table="SKILLER"><key column="EMPLOYEE_ID" /><property name="skiller" /></joined-subclass><joined-subclass name="Salesman" table="SALESMAN"><key column="EMPLOYEE_ID" /><property name="salesman" /></joined-subclass></class>
</hibernate-mapping>

两种继承映射方法混合使用

<hibernate-mapping package="cn.model"><class name="Employee" table="EMPLOYEE" discriminator-value="0"><id name="id" column="ID"><generator class="native"></generator></id><discriminator column="type" type="int"/><property name="name" column="NAME" type="java.lang.String" unique="true" /><subclass name="Skiller" discriminator-value="1"><property name="skiller" /></subclass><subclass name="Salesman" discriminator-value="2"><join table="SALESMAN"><key column="EMPLOYEE_ID" /><property name="salesman" /></join></subclass></class>
</hibernate-mapping>

执行以后Hibernate所创建的表:

Hibernate: create table EMPLOYEE (ID integer not null auto_increment,type integer not null,NAME varchar(255) unique,skiller varchar(255),primary key (ID))
Hibernate: create table SALESMAN (EMPLOYEE_ID integer not null,salesman varchar(255),primary key (EMPLOYEE_ID))
Hibernate: alter table SALESMAN add index FKA21A20CEFABB3642 (EMPLOYEE_ID), add constraint FKA21A20CEFABB3642 foreign key (EMPLOYEE_ID) references EMPLOYEE (ID)


每个类独立映射一张表:
<hibernate-mapping package="cn.model"><class name="Employee" table="EMPLOYEE"><id name="id" column="ID"><generator class="hilo"></generator></id><property name="name" column="NAME" type="java.lang.String" unique="true" /><union-subclass name="Skiller" table="SKILLER"><property name="skiller" /></union-subclass><union-subclass name="Salesman" table="SALESMAN"><property name="salesman" /></union-subclass></class>
</hibernate-mapping>

注:在使用这种映射的时候,主键ID不能使用<generator class="native" /> 了因为在生成主键的时候三个表有可能重复,因此必须要使用不会重复的主键生成器,比如UUID或者上文中用的hilo高低位生成ID;

运行程序 可看到,Hibernate生成的三个表都是独立的三个月,之间都没有关系:

转载于:https://www.cnblogs.com/raphael5200/p/5114753.html

Hibernate 、继承关联映射相关推荐

  1. 初识Hibernate之关联映射(一)

    上篇文章我们对持久化对象进行的学习,了解了它的三种不同的状态并通过它完成对数据库的映射操作.但这都是基于单张表的操作,如果两张或者两张以上的表之间存在某种关联,我们又该如何利用持久化对象进行操作呢?本 ...

  2. hibernate继承关系映射方法(一)--共享一张表

    对于如下关系: Person.java package com.hust.PO;public class Person {private Integer id;private String name; ...

  3. Hibernate的关联映射--一对多、

    这是我 1 单向一对多: 实体类:(课程类)Grade与(学生类)Student的一对多关系 学生类: public class Student implements java.io.Serializ ...

  4. 8 Hibernate:关联映射(Associations)

    Hibernate 关联映射(Associations)分为: 8.1 Hibernate:一对一关联映射    8.1.1 Hibernate:一对一单向关联(unidirectional)     ...

  5. chapter6 Hibernate的关联映射

    回顾 ·          下面这个异常是怎么回事?该怎么解决? org.hibernate.MappingException: Unknownentity: com.aptech.jb.entity ...

  6. hibernate继承关系映射关系方法(二)--每个子类一张表

    TPS:所谓"每个子类一张表(Table Per Subclass)":父类一张表,每个子类一张表,父类的表保存公共有信息,子类的表只保存自己特有的信息 这种策略是使用<jo ...

  7. Hibernate一对一关联映射配置

    一对一关联 Hibernate提供了两种映射一对一关联关系的方式:按照外键映射和按照主键映射.下面以员工账号和员工档案表为例,介绍这两种映射方式,并使用这两种映射方式分别完成以下持久化操作: (1)保 ...

  8. hibernate继承关系映射方法(三)--每个具体类一张表TPC

    TPC:所谓是"每个具体类一张表(table per concrete class)"的意思是:使继承体系中每一个子类都对应数据库中的一张表.每一个子类对应的数据库表都包含了父类的 ...

  9. Hibernate之关联映射

    在现实生活中 ,很少有对象是孤立存在的,例如老师,往往和被授课的学生存在关联关系,如果得到了某个老师实例,那么我们就可以直接获取该老师 对应的全部学生.同样,我们得到了一个学生实例  ,我们也可以获取 ...

  10. java继承 映射_hibernate继承关系映射和java反射机制的运用

    转:http://blog.csdn.net/derpvailzhangfan/article/details/1957946 ,感谢博主分享 Notes:hibernate元数据的运用:uuid的概 ...

最新文章

  1. C++中数组的赋值方法
  2. 波士顿动力机器狗新技能!跳绳园艺做家务,还有书法神技
  3. 资源利用率监控与存储卷(pv/pvc)
  4. Django源代码阅读分析-2:持久层结构分析
  5. mysql 实现非递归树_二叉树的非递归前序,中序,后序遍历算法
  6. 数字信号处理——DFT的一些理解
  7. 荣耀MagicV今晚亮相:刷新对传统折叠屏厚重的认知
  8. Config文件的使用:通过程序修改Config文件
  9. oracle数据泵能增量吗,Oracle12c中数据泵新特性之功能增强(expdp, impdp)
  10. windows。forms.timer设置第一次不等待_混凝土密封固化剂个人简易施工方案(不打磨)...
  11. 物联网学什么编程语言_物联网要学什么
  12. 推荐5款实用的PC端软件!!!
  13. 网赚项目活动线报监控提醒
  14. c++ 获取硬盘序列号serialnumber
  15. 写代码不严谨,我就不配当程序员?
  16. 百度联盟广告代码php,仿百度联盟对联广告实现代码
  17. 路在脚下--我的程序员之路
  18. 字节跳动技术团队年度 TOP10 技术干货,陪你度过不平凡的 2020
  19. Java 获取网络url图片返回file文件对象
  20. 阿里天池课堂Python

热门文章

  1. 2022年全国职业院校技能大赛网络安全赛卷(中职组)卷1
  2. 7.TCP的十一种状态集
  3. Cesium 加载实景三维模型 优化建议
  4. 没有事业的女人会很惨
  5. html5加号展开减号缩减,CSS3 linear-gradient线性渐变生成加号和减号的方法
  6. 基于CIM的新型智慧城市发展政策解析
  7. 打游戏计算机内存不足,玩游戏老提示内存不足怎么办
  8. oracle sql去重
  9. 牛客面经 | BAT、美团、360、滴滴新锐……2W字干货,这不仅仅是一篇面经
  10. CSS、Bulma介绍