一个继承树一张表(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生成的三个表都是独立的三个月,之间都没有关系:

Hibernate 、继承关联映射的更多相关文章

  1. Hibernate注解----关联映射注解以及课程总结详解----图片版本

    上一篇,记录了Hibernate注解----类级别注解以及属性注解详解 ,我们这一节主要讲解的是Hibernate注解----关联映射注解以及课程总结详解. 本节的主要内容: 第3章 关联映射注解 3 ...

  2. Hibernate的关联映射——双向1-N关联

    Hibernate的关联映射--双向1-N关联 对于1-N的关联,Hibernate推荐使用双向关联,而且不要让1的一端控制关联关系,而是用N的一端控制关联关系.双线的1-N关联和N-1关联是两种相同 ...

  3. Hibernate的关联映射——单向1-N关联

    Hibernate的关联映射--单向1-N关联 单向1-N关联的持久化类里需要使用集合属性.因为1的一端需要访问N的一端,而N的一端将以集合(Set)形式表现.从这个意义上来看,1-N(实际上还包括N ...

  4. Hibernate的关联映射——单向1-1关联

    Hibernate的关联映射--单向1-1关联 对于单向的1-1关联关系,需要在持久化类里增加代表关联实体的成员变量,并为该成员变量添加setter方法和getter方法.从持久化类的代码上看,单向1 ...

  5. Hibernate的关联映射——单向N-1关联

    Hibernate的关联映射--单向N-1关联 N-1是非常常见的关联关系,最常见的父子关系也是N-1关联,单向的N-1关联只需从N的一端可以访问1的一端. 为了让两个持久化类能够支持这种关联映射,程 ...

  6. Hibernate之关联映射(一对多和多对一映射,多对多映射)

    ~~~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习以下框架了,不然又被忽悠让去培训.)~~~ 1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射: 1.1: ...

  7. 初识Hibernate之关联映射(二)

    上篇我们介绍了关联映射的几种形式,有单向多对一,单向一对多,还有双向一对多.本篇接着介绍有关关联映射的其他几种映射方式,主要有以下几种: 基于外键的单向一对一关联映射 基于主键的单向一对一关联映射 单 ...

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

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

  9. Hibernate的关联映射关系

    一:多对一 <many-to-one 1.name:当前类的属性名(关联映射的类) 2.column:属性多对应的类的对应的表的外键(连接条件) 3.class:属性所对应的类的权限定名 4.n ...

  10. 关于Hibernate的关联映射

    何为关联映射 由于数据库的表与表之间存在的管理关系,可以分为一对一,一对多和多对多关联,一般情况下,在数据库设计中是通过表的外键来建立各种关系的,在Hibernate中则把数据库表与表之间的关系数据映 ...

随机推荐

  1. 環氧樹脂對COB的影響

    COB的封膠一般使用單液 Epoxy(環氧樹脂),也可以使用雙液(Epoxy+硬化劑),雙液的成品品質可靠度雖然比較高,但是保存及維護非常麻煩,所以一般的 COB 都還是採用單液的製程. 其次是如何控 ...

  2. Erlang语言介绍

    Erlang (/ˈɜrlæŋ/ er-lang) is a general-purpose concurrent, garbage-collected programming language an ...

  3. HTML5 页面制作工具

    https://www.zhihu.com/question/30087283 HTML5 页面制作工具 免费的基于 HTML 5 的 Web Apps 生成器工具网站     81 235 初页 制 ...

  4. MFC窗口的父子关系和层级关系

    一直对窗口之间的关系有些混乱,遇到需要指定父窗口的函数时常常要考虑很久,究竟父窗口是哪个窗口,遂上网查资料,略有所悟,简记如下: 对话框中的所有控件(比如Button等)都是其子窗口.        ...

  5. IPicture总结

    1.利用IPicture接口加载.显示图片 IPicture接口管理一个图片对象和它的属性.图片对象提供对Bitmap Icon Metafile的语言不相关的抽象支持.图像对象的主要接口是IPict ...

  6. hdu 1050 Moving Tables_贪心

    题意:你搬n个桌子,桌子从一个地方搬到另一个地方,走廊只允许同时一个桌子通过,教室分布在两边,奇数在一边,偶数在一边,当桌子不冲突时可以同时搬运,冲突时要等别的那个桌子搬完再搬. 思路:因为奇数桌子在 ...

  7. JS属性

    1.类型分析: js中的数据类型有undefined,boolean,number,string,object等5种,前4种为原始类型,第5种为引用类型. 代码: var a1;var a2 = tr ...

  8. Codeforces Round #245 (Div. 1)——Working out

    题目链接 题意: 一个n*m的矩阵,每一个方格有一个非负数,如今选择两条线路:一个左上到右下,一个左下到右上,且仅仅能有一个公共点. 求两个线路上数的最大值(公共点不算) 分析: 仅仅有两种情况,dp ...

  9. android分割线

    http://blog.csdn.net/dekunchenivan/article/details/6640804 在Android布局文件layout中设置水平分割线: <View      ...

  10. golang高级部分

    一.golang之OOP(orient object programming) 在函数声明时, 在其名字之前放上一个变量, 即是一个方法. 这个附加的参数会将该函数附加到这种类型上, 即相当于为这种类 ...