hiberate 映射关系 详解
在我们平时所学的关系型数据库中,我们会大量处理表与表之间的关系,如果表比较多的话处理起来就比较繁琐了,但是hibernate给我们提供了很大的便利,这些便利让我们处理起来方便。我们所讲的源码地址:http://download.csdn.net/detail/yfyzy/8953565
如果我们把表的每条记录当成一个对象的话,那我们我们的映射关系可以分为四种
1)一对一
2)一对多
3)多对一
4)多对多
准备工作
现在我们假设有四个表,员工表,部门表,办工作表,职位表,有如下映射关系
1)多个员工对应一个部门
2)一个部门对应多个员工
3)一个员工对应多个职位(这里我们假设一个人有多大能力,就要承担多大责任,所有就先多对多啦~O(∩_∩)O~)。
4)一个职位对应多个员工
5)一个员工对应一张办公桌,一张办公桌对应一个员工。

1.多对一 与 一对多
通过上面的描述我们知道员工多个员工对应着一个部门
员工实体(多方)
package entity; import java.util.HashSet;
import java.util.Set; public class Emp { private int id ; //员工id
private String name ; //员工姓名
private int age ; //员工年龄
private Dept dept; //员工部门 ,注意这里是Dept对象哦,不是id哦 public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
public Set<Position> getPositions() {
return positions;
}
public void setPositions(Set<Position> positions) {
this.positions = positions;
} } }
员工实例与数据库表映射关系配置(多方)
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- 员工实体类Emp与员工表t_emp的映射 -->
<hibernate-mapping >
<class name="entity.Emp" table="t_emp"> <!-- 主键id配置 -->
<id name="id" column="id">
<!--
数据库的主键生成策略 native配置为使用数据库自带的生成策略 关于参数详解参考:http://www.cnblogs.com/yfyzy/p/4675041.html
-->
<generator class="native"></generator>
</id> <!-- 属性设置 -->
<property name="name" column="name" >
</property>
<property name="age" column="age">
</property> <!-- 多对一配置,多个员工对应一个部门 -->
<many-to-one name = "dept" class="entity.Dept"
column = "dept_id" cascade="save-update">
</many-to-one> </class>
</hibernate-mapping>
部门实体(一方)
package entity; import java.util.HashSet;
import java.util.Set; public class Dept {
private int id; // 部门id
private String dname; // 部门名称
private Set<Emp> emps = new HashSet<Emp>(); //该部门的员工,是一个集合。 public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getDname() {
return dname;
} public void setDname(String dname) {
this.dname = dname;
} public Set<Emp> getEmps() {
return emps;
} public void setEmps(Set<Emp> emps) {
this.emps = emps;
} }
部门实体与数据表的映射(一方)
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- 部门实体类Dept与员工表t_dept的映射 -->
<hibernate-mapping>
<class name = "entity.Dept" table = "t_dept"> <!-- 主键id配置 -->
<id name="id" column="id">
<!--
数据库的主键生成策略 native配置为使用数据库自带的生成策略 关于参数详解参考:http://www.cnblogs.com/yfyzy/p/4675041.html
-->
<generator class="native"></generator>
</id> <!-- 属性设置 -->
<property name="dname" column="dname" >
</property> <!-- 一对多配置,一个部门有多个员工,所以是一个集合 -->
<set name = "emps" cascade = "all" inverse="true">
<key column = "dept_id"></key>
<one-to-many class="entity.Emp"></one-to-many>
</set> </class>
</hibernate-mapping>
2.多对多
这里我们假设的是,一个员工对应多个职位,一个职位有多个员工。
员工实体类
package entity; import java.util.HashSet;
import java.util.Set; public class Emp { private int id ; //员工id
private String name ; //员工姓名
private int age ; //员工年龄
private Dept dept; //员工部门 ,注意这里是Dept对象哦,不是id哦
private Set<Position> positions = new HashSet<Position>(); //注意这里是一个Position职位集合,我们这里假设一个员工可以对应多个职位 public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
public Set<Position> getPositions() {
return positions;
}
public void setPositions(Set<Position> positions) {
this.positions = positions;
}
}
员工实体与数据库映射关系
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- 员工实体类Emp与员工表t_emp的映射 -->
<hibernate-mapping >
<class name="entity.Emp" table="t_emp"> <!-- 主键id配置 -->
<id name="id" column="id">
<!--
数据库的主键生成策略 native配置为使用数据库自带的生成策略 关于参数详解参考:http://www.cnblogs.com/yfyzy/p/4675041.html
-->
<generator class="native"></generator>
</id> <!-- 属性设置 -->
<property name="name" column="name" >
</property>
<property name="age" column="age">
</property> <!-- 多对一配置,多个员工对应一个部门 -->
<many-to-one name = "dept" class="entity.Dept"
column = "dept_id" cascade="save-update">
</many-to-one> <!-- 多对多配置,一个员工可以对应多个职位 -->
<set name="positions" inverse="false" cascade="save-update" table="t_emp_position">
<key column="emp_id"></key>
<many-to-many class = "entity.Position" column = "position_id">
</many-to-many>
</set> </class>
</hibernate-mapping>
职位实体
package entity; import java.util.HashSet;
import java.util.Set; public class Position {
private int id ; //职位id
private String positionName ; //职位名称
private Set<Emp> emps = new HashSet<Emp>(); //存放这种职位的员工 public Set<Emp> getEmps() {
return emps;
}
public void setEmps(Set<Emp> emps) {
this.emps = emps;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPositionName() {
return positionName;
}
public void setPositionName(String positionName) {
this.positionName = positionName;
} }
实体与数据库表的映射关系
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- 职位实体类Emp与员工表t_position的映射 -->
<hibernate-mapping>
<class name="entity.Position" table="t_position"> <!-- 主键id配置 -->
<id name="id" column = "id">
<generator class="native"></generator>
</id> <!-- 属性设置 -->
<property name="positionName" column="position_name"/> <!-- 多对多配置,一个职位可以对应多个员工 -->
<set name="emps" inverse="true" cascade="save-update" table="t_emp_position">
<key column="position_id"></key>
<many-to-many class = "entity.Emp" column = "emp_id">
</many-to-many>
</set> </class> </hibernate-mapping>
3.一对一
一个员工对应一个办公桌,一张办公桌也只对应一个员工
一对关联的方式有两种
1)外键关联
2)主键关联
3.1外键关联
本质上是一对多的蜕化形式。在<many-to-one>元素中设置属性unique=”true”就变成了一对一。
员工实体
package entity; import java.util.HashSet;
import java.util.Set; public class Emp { private int id ; //员工id
private String name ; //员工姓名
private int age ; //员工年龄
private Dept dept; //员工部门 ,注意这里是Dept对象哦,不是id哦
private Set<Position> positions = new HashSet<Position>(); //注意这里是一个Position职位集合,我们这里假设一个员工可以对应多个职位。
private Desk desk; //办工桌对象 public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
public Set<Position> getPositions() {
return positions;
}
public void setPositions(Set<Position> positions) {
this.positions = positions;
}
public Desk getDesk() {
return desk;
}
public void setDesk(Desk desk) {
this.desk = desk;
} }
员工实体类Emp与数据库表t_emp的映射关系
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- 员工实体类Emp与员工表t_emp的映射 -->
<hibernate-mapping >
<class name="entity.Emp" table="t_emp"> <!-- 主键id配置 -->
<id name="id" column="id">
<!--
数据库的主键生成策略 native配置为使用数据库自带的生成策略 关于参数详解参考:http://www.cnblogs.com/yfyzy/p/4675041.html
-->
<generator class="native"></generator>
</id> <!-- 属性设置 -->
<property name="name" column="name" >
</property>
<property name="age" column="age">
</property> <!-- 多对一配置,多个员工对应一个部门 -->
<many-to-one name = "dept" class="entity.Dept"
column = "dept_id" cascade="save-update">
</many-to-one> <!-- 多对多配置,一个员工可以对应多个职位 -->
<set name="positions" inverse="false" cascade="save-update" table="t_emp_position">
<key column="emp_id"></key>
<many-to-many class = "entity.Position" column = "position_id">
</many-to-many>
</set> <!-- 一对一配置,设置属性unique=”true”就变成了一对一 -->
<many-to-one name="desk" class="entity.Desk" column="desk_id" unique="true"></many-to-one> </class>
</hibernate-mapping>
办工桌实体类
package entity;
public class Desk {
private int id ; // 办公桌id
private String deskName; //办工桌名称
private Emp emp ; //员工,这张桌子的拥有者
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDeskName() {
return deskName;
}
public void setDeskName(String deskName) {
this.deskName = deskName;
}
public Emp getEmp() {
return emp;
}
public void setEmp(Emp emp) {
this.emp = emp;
}
}
办工桌实体类Desk与数据库表t_desk的映射
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- 部门实体类Dept与员工表t_dept的映射 -->
<hibernate-mapping>
<class name = "entity.Desk" table = "t_desk"> <!-- 主键id配置 -->
<id name="id" column="id">
<!--
数据库的主键生成策略 native配置为使用数据库自带的生成策略 关于参数详解参考:http://www.cnblogs.com/yfyzy/p/4675041.html
-->
<generator class="native"></generator>
</id> <!-- 属性设置 -->
<property name="deskName" column="desk_name" >
</property> <!-- 一对一配置,一个员工对应一张桌子 -->
<one-to-one name="emp" class="entity.Emp" cascade="all" >
</one-to-one> </class>
</hibernate-mapping>
3.2主键关联
主键关联即其中一个表的主键参照另外一张表的主键而建立起一对一关联关系
员工实体类Emp与数据库表t_emp的映射关系修改如下
<!-- 一对一主键关联配置,一个员工对应一张桌子 -->
<one-to-one name="desk" class="entity.Desk"></one-to-one>
办工桌实体类Desk与数据库表t_desk修改如下
<!-- 一对一配置,一个员工对应一张桌子 -->
<one-to-one name="emp" class="entity.Emp" cascade="all" >
</one-to-one>
hiberate 映射关系 详解的更多相关文章
- EntityFramework Core映射关系详解
前言 Hello,开始回归开始每周更新一到两篇博客,本节我们回归下EF Core基础,来讲述EF Core中到底是如何映射的,废话少说,我们开始. One-Many Relationship(一对多关 ...
- 补知识:EntityFramework Core映射关系详解
前言 本节我们回归下EF Core基础,来讲述EF Core中到底是如何映射的,废话少说,我们开始. One-Many Relationship(一对多关系) 首先我们从最简单的一对多关系说起,我们给 ...
- Hibernate配置文件和映射文件详解
Hibernate是一个彻底的ORM(Object Relational Mapping,对象关系映射)开源框架. 我们先看一下官方文档所给出的,Hibernate 体系结构的高层视图: 其中PO=P ...
- MyBatis 映射文件详解(六)
MyBatis 配置文件类型 MyBatis配置文件有两种类型,如下: 全局配置文件(如 mybatis-config.xml) Mapper XML 映射文件(如 UserMapper.xml) 上 ...
- slf4j log4j logback关系详解和相关用法
slf4j log4j logback关系详解和相关用法 写java也有一段时间了,一直都有用slf4j log4j输出日志的习惯.但是始终都是抱着"拿来主义"的态度,复制粘贴下配 ...
- 【转】UML类图与类的关系详解
UML类图与类的关系详解 2011-04-21 来源:网络 在画类图的时候,理清类和类之间的关系是重点.类的关系有泛化(Generalization).实现(Realization).依赖(D ...
- UML类图与类的关系详解
摘自:http://www.uml.org.cn/oobject/201104212.asp UML类图与类的关系详解 2011-04-21 来源:网络 在画类图的时候,理清类和类之间的关系是重点.类 ...
- Hibernate中的多对多关系详解(3)
前面两节我们讲到了一对一的关系,一对多,多对一的关系,相对来说,是比较简单的,但有时,我们也会遇到多对多的关系,比如说:角色与权限的关系,就是典型的多对多的关系,因此,我有必要对这种关系详解,以便大家 ...
- slf4j log4j logback log4j2关系详解和相关用法
来源:slf4j log4j logback关系详解和相关用法https://www.cnblogs.com/Sinte-Beuve/p/5758971.html The Simple Logging ...
随机推荐
- F#周报2019年第12期
新闻 Amazon.Lambda.RuntimeSupport发布 Forge 3.0架构 Blazor 0.9.0试验版发布 通过微软游戏栈实现更多应用 介绍ASP.NET Core中的gRPC M ...
- 使用ElasticSearch全文检索以及集群部署
ElasticSearch 即 ES 安装:版本---elasticsearch-2.4.6.tar.gz tar -zxvf elasticsearch-2.4.6.tar.gz 由于es不允许使 ...
- Web开发(XAMPP服务器搭建)
XAMPP是一个功能强大的搭建服务器环境的软件集成包.它集成了Apache.MySql.php.perl这几个服务器常用的软件.而我们在使用时,省去了安装这些软件的步骤,只需要下载XAMPP,解压缩. ...
- ajax php 验证注册用户名是否存在
1.在"test"数据库中,建立一张名为"user"的表. sql语句: create table `user`( `id` ) not null auto_i ...
- SharePoint 2013 拷贝文件夹到本地
网站--设计(小齿轮)--网站内容--文档库--打开文档库后---单击标题--库--找到下图的红色框的图标. 其名称[使用资源管理器打开] 打开后所有的操作都像资源管理器的操作方式一样
- 代码块: 以冒号作为开始,用缩进来划分作用域,这个整体叫做代码块,python的代码块可以提升整体的整齐度,提高开发效率
# ### 代码块: 以冒号作为开始,用缩进来划分作用域,这个整体叫做代码块 if 5 == 5: print(1) print(2) if True: print(3) print(4) if Fa ...
- 训练集(train set),验证集(validation set)和测试集(test set)
把数据集分为三部分,分别为:训练集(train set),验证集(validation set)和测试集(test set). 具体比例有各种说法.待补充 测试集是为了测模型泛化能力,不能在训练的时候 ...
- CDI services--Decorators(装饰器)
1.Decorators装饰器综述 拦截器是一种强大的方法在应用程序捕捉运行方法和解耦.拦截器可以拦截任何java类型的调用. 这使得拦截器适合解决事务管理,安全性,以及日记记录. 本质上说,拦截器并 ...
- 灵雀云受邀加入VMware 创新网络,共同助力企业数字化进程
11月15日,在VMware主办的“VMware创新网络”2018高峰论坛上,VMware发布了VMware创新网络(VMwareInnovation Network,VIN)的长期发展规划和 ...
- 轻量级集群管理软件-Ansible
ansible概述和运行机制 ansible概述 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具, 它用Python写成,类似于saltstack和Puppet,但是有一个不同 ...