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中则把数据库表与表之间的关系数据映 ...
随机推荐
- linux----用户与whoami
linux中的su 命令可以完成用户切换:如我们先由root切换到mysql用户可以这样做su - mysql whoami #这个时候linux会打印出mysql who am i #这个时候lin ...
- 构建混合云:配置Azure site to site VPN连接(3)
9. 那么我们来创建网关,创建网关的时候需要注意,看看你的设备是否支持动态网关,在本示例中的Cisco ASA 5550不支持动态网关,所以我们只能创建静态网关: 该创建会花费一定的时间,稍等即可. ...
- Oracle EBS-SQL (INV-10):检查库存接口.sql
/*检查库存接口表*/ select msi.segment1 项目编码, msi.description ...
- Myeclipse 2014配置SVN详细图解
1.什么是SVN? 管理软件开发过程中的版本控制工具. 2.myeclipse安装SVN插件步骤,以myeclipse 2014为例. (1)下载SVN插件 http://subclipse.tigr ...
- MEMS加速度计工作原理
一般加速度计有两块芯片组成,一块是MEMS传感器,另一块是客户化的信号处理芯片. 加速度计也称惯性传感器,因为它的工作原理就是靠MEMS中可移动部分的惯性.由于中间电容板的质量很大,而且它是一种悬臂构 ...
- perl 实现微信简版<2>
<pre name="code" class="python">use LWP::UserAgent; use URI::Escape; use N ...
- JIRA官方:JIRA项目跟踪
问题无处不在 使用JIRA来捕捉任何类型的问题——从软件缺陷到新特性到需求和故事到任务和活动项.你可以很方便地定义自己的问题类型以匹配团队工作需要. 自定义工作流 一个项目跟踪工具不应该决定你的工作方 ...
- UML_静态图
类图 类图是描述类,接口,协作以及它们之间关系的图,用来显示系统中各个类的静态结构.类图是定义其他图的基础,在类图的基础上,可以使用状态图,协作图,组件图和配置图等进一步描述系统其他方面 ...
- List<T>用法总结【转】
List<T>用法总结 static void Main(string[] args) { Person p1 = new Person( "aladdin" , 20 ...
- js(1)不太注意的一些小事件
确认选择 除了向用户提供信息,我们还希望从用户那里获得信息.这里就用到了confirm 消息对话框. 语法:confirm(str); 参数说明: str: 在消息对话框中要显示的文本,返回的是布尔值 ...