Hibernate 、继承关联映射
<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注解----关联映射注解以及课程总结详解----图片版本
上一篇,记录了Hibernate注解----类级别注解以及属性注解详解 ,我们这一节主要讲解的是Hibernate注解----关联映射注解以及课程总结详解. 本节的主要内容: 第3章 关联映射注解 3 ...
- Hibernate的关联映射——双向1-N关联
Hibernate的关联映射--双向1-N关联 对于1-N的关联,Hibernate推荐使用双向关联,而且不要让1的一端控制关联关系,而是用N的一端控制关联关系.双线的1-N关联和N-1关联是两种相同 ...
- Hibernate的关联映射——单向1-N关联
Hibernate的关联映射--单向1-N关联 单向1-N关联的持久化类里需要使用集合属性.因为1的一端需要访问N的一端,而N的一端将以集合(Set)形式表现.从这个意义上来看,1-N(实际上还包括N ...
- Hibernate的关联映射——单向1-1关联
Hibernate的关联映射--单向1-1关联 对于单向的1-1关联关系,需要在持久化类里增加代表关联实体的成员变量,并为该成员变量添加setter方法和getter方法.从持久化类的代码上看,单向1 ...
- Hibernate的关联映射——单向N-1关联
Hibernate的关联映射--单向N-1关联 N-1是非常常见的关联关系,最常见的父子关系也是N-1关联,单向的N-1关联只需从N的一端可以访问1的一端. 为了让两个持久化类能够支持这种关联映射,程 ...
- Hibernate之关联映射(一对多和多对一映射,多对多映射)
~~~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习以下框架了,不然又被忽悠让去培训.)~~~ 1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射: 1.1: ...
- 初识Hibernate之关联映射(二)
上篇我们介绍了关联映射的几种形式,有单向多对一,单向一对多,还有双向一对多.本篇接着介绍有关关联映射的其他几种映射方式,主要有以下几种: 基于外键的单向一对一关联映射 基于主键的单向一对一关联映射 单 ...
- 初识Hibernate之关联映射(一)
上篇文章我们对持久化对象进行的学习,了解了它的三种不同的状态并通过它完成对数据库的映射操作.但这都是基于单张表的操作,如果两张或者两张以上的表之间存在某种关联,我们又该如何利用持久化对象进行操作呢?本 ...
- Hibernate的关联映射关系
一:多对一 <many-to-one 1.name:当前类的属性名(关联映射的类) 2.column:属性多对应的类的对应的表的外键(连接条件) 3.class:属性所对应的类的权限定名 4.n ...
- 关于Hibernate的关联映射
何为关联映射 由于数据库的表与表之间存在的管理关系,可以分为一对一,一对多和多对多关联,一般情况下,在数据库设计中是通过表的外键来建立各种关系的,在Hibernate中则把数据库表与表之间的关系数据映 ...
随机推荐
- webapi文档
webapi文档描述-swagger 最近做的项目使用mvc+webapi,采取前后端分离的方式,后台提供API接口给前端开发人员.这个过程中遇到一个问题后台开发人员怎么提供接口说明文档给前端开发人员 ...
- Oracle EBS-SQL (OM-3):销售连接停靠站时冲减库存出错处理.sql
DELETE FROM INV.MTL_RESERVATIONS MRWHERE EXISTS (SELECT 1 FROM WSH.WSH_DELIVERY_ASSIGNMENTS WDA ...
- java 基础知识
...是Java代码的一部分,表明可以接受任意数量的对象,例子如下: 感觉很有趣 public static double max(double... values){ double largest ...
- poj 3253 Fence Repair(模拟huffman树 + 优先队列)
题意:如果要切断一个长度为a的木条需要花费代价a, 问要切出要求的n个木条所需的最小代价. 思路:模拟huffman树,每次选取最小的两个数加入结果,再将这两个数的和加入队列. 注意priority_ ...
- cocos2d-x 打包工具用Shell 还是 用 Python
功能上说两种脚本都可以完成工作.但是跨平台开发用Shell意味着脚本要写两套.Macosx 的bash 和window bat.如果用python写一套就可以了.
- Storages and virtual servers
1. IBM Storages: SONAS,V7k,V7ku,SVC,XIV 存储设备都安装了个性化定制的Linux系统,来完成不同的服务,这几台存储设备使用原理都是类似的,以SONAS (Scal ...
- lhgDialog
应用到你的项目 如果您使用独立版本的lhgDialog窗口组件,您只需在页面head中引入lhgcore.lhgdialog.min.js文件,4.1.1+版本做了修改可以和jQuerya库同时引用, ...
- 前端学习——JQuery Ajax使用经验
0.前言 在项目推进过程中常常使用Ajax,通过Jquery提供的函数能够很方便的使用Ajax,可是在实际使用中也遇到一些问题,比如怎样防止浏览器使用缓存,怎样使用同步方式等.通过博文整理总结 ...
- 响应式流布局插件DyLay
jQuery插件-Dylay,流布局我们前面介绍过很多,但这个流布局jQuery插件不同的是它的动画效果很不错,大家可以尝试使用下.另外<有用的jQuery布局插件推荐>这篇文章中有好几个 ...
- UVA 10410 Tree Reconstruction
题意: 给定一个树的BFS和DFS,求这棵树. 分析: 拿dfs的序列,分成若干段,每一段相当一个子树,这样就可以利用bfs的序列去将dfs的序列分段,然后利用一个队列去存放每一段,不断求出子树即可. ...