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中则把数据库表与表之间的关系数据映 ...
随机推荐
- 環氧樹脂對COB的影響
COB的封膠一般使用單液 Epoxy(環氧樹脂),也可以使用雙液(Epoxy+硬化劑),雙液的成品品質可靠度雖然比較高,但是保存及維護非常麻煩,所以一般的 COB 都還是採用單液的製程. 其次是如何控 ...
- Erlang语言介绍
Erlang (/ˈɜrlæŋ/ er-lang) is a general-purpose concurrent, garbage-collected programming language an ...
- HTML5 页面制作工具
https://www.zhihu.com/question/30087283 HTML5 页面制作工具 免费的基于 HTML 5 的 Web Apps 生成器工具网站 81 235 初页 制 ...
- MFC窗口的父子关系和层级关系
一直对窗口之间的关系有些混乱,遇到需要指定父窗口的函数时常常要考虑很久,究竟父窗口是哪个窗口,遂上网查资料,略有所悟,简记如下: 对话框中的所有控件(比如Button等)都是其子窗口. ...
- IPicture总结
1.利用IPicture接口加载.显示图片 IPicture接口管理一个图片对象和它的属性.图片对象提供对Bitmap Icon Metafile的语言不相关的抽象支持.图像对象的主要接口是IPict ...
- hdu 1050 Moving Tables_贪心
题意:你搬n个桌子,桌子从一个地方搬到另一个地方,走廊只允许同时一个桌子通过,教室分布在两边,奇数在一边,偶数在一边,当桌子不冲突时可以同时搬运,冲突时要等别的那个桌子搬完再搬. 思路:因为奇数桌子在 ...
- JS属性
1.类型分析: js中的数据类型有undefined,boolean,number,string,object等5种,前4种为原始类型,第5种为引用类型. 代码: var a1;var a2 = tr ...
- Codeforces Round #245 (Div. 1)——Working out
题目链接 题意: 一个n*m的矩阵,每一个方格有一个非负数,如今选择两条线路:一个左上到右下,一个左下到右上,且仅仅能有一个公共点. 求两个线路上数的最大值(公共点不算) 分析: 仅仅有两种情况,dp ...
- android分割线
http://blog.csdn.net/dekunchenivan/article/details/6640804 在Android布局文件layout中设置水平分割线: <View ...
- golang高级部分
一.golang之OOP(orient object programming) 在函数声明时, 在其名字之前放上一个变量, 即是一个方法. 这个附加的参数会将该函数附加到这种类型上, 即相当于为这种类 ...