在我们平时所学的关系型数据库中,我们会大量处理表与表之间的关系,如果表比较多的话处理起来就比较繁琐了,但是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 映射关系 详解的更多相关文章

  1. EntityFramework Core映射关系详解

    前言 Hello,开始回归开始每周更新一到两篇博客,本节我们回归下EF Core基础,来讲述EF Core中到底是如何映射的,废话少说,我们开始. One-Many Relationship(一对多关 ...

  2. 补知识:EntityFramework Core映射关系详解

    前言 本节我们回归下EF Core基础,来讲述EF Core中到底是如何映射的,废话少说,我们开始. One-Many Relationship(一对多关系) 首先我们从最简单的一对多关系说起,我们给 ...

  3. Hibernate配置文件和映射文件详解

    Hibernate是一个彻底的ORM(Object Relational Mapping,对象关系映射)开源框架. 我们先看一下官方文档所给出的,Hibernate 体系结构的高层视图: 其中PO=P ...

  4. MyBatis 映射文件详解(六)

    MyBatis 配置文件类型 MyBatis配置文件有两种类型,如下: 全局配置文件(如 mybatis-config.xml) Mapper XML 映射文件(如 UserMapper.xml) 上 ...

  5. slf4j log4j logback关系详解和相关用法

    slf4j log4j logback关系详解和相关用法 写java也有一段时间了,一直都有用slf4j log4j输出日志的习惯.但是始终都是抱着"拿来主义"的态度,复制粘贴下配 ...

  6. 【转】UML类图与类的关系详解

    UML类图与类的关系详解   2011-04-21 来源:网络   在画类图的时候,理清类和类之间的关系是重点.类的关系有泛化(Generalization).实现(Realization).依赖(D ...

  7. UML类图与类的关系详解

    摘自:http://www.uml.org.cn/oobject/201104212.asp UML类图与类的关系详解 2011-04-21 来源:网络 在画类图的时候,理清类和类之间的关系是重点.类 ...

  8. Hibernate中的多对多关系详解(3)​

    前面两节我们讲到了一对一的关系,一对多,多对一的关系,相对来说,是比较简单的,但有时,我们也会遇到多对多的关系,比如说:角色与权限的关系,就是典型的多对多的关系,因此,我有必要对这种关系详解,以便大家 ...

  9. slf4j log4j logback log4j2关系详解和相关用法

    来源:slf4j log4j logback关系详解和相关用法https://www.cnblogs.com/Sinte-Beuve/p/5758971.html The Simple Logging ...

随机推荐

  1. uwp 动画Storyboard

    代码如下: <Page.Resources>        <Storyboard x:Name="storyboard">            < ...

  2. Centos 安装Java jdk

    1/ yum search java|grep jdk 2/ yum install java-......... 3/ vi /etc/profile 在最后添上: 4/ source /etc/p ...

  3. memory error python报错

    np.array时报错内存溢出,检查了python安装的是64位版本,通过下面dtype=np.uint8不再报错texts_vec = (np.array(texts_vec,dtype=np.ui ...

  4. ASP.NET微信支付XXE漏洞修复

    1. XXE场景 关于XML解析存在的安全问题指引 微信支付商户,最近暴露的XML外部实体注入漏洞(XML External Entity Injection,简称 XXE),该安全问题是由XML组件 ...

  5. 学号 20175313《Java程序设计》 第七周学习总结

    目录 一.教材学习内容总结 二.教材学习中的问题和解决过程 三.代码托管 四.心得体会 五.学习进度条 六.参考资料 一.教材学习内容总结 第八章主要内容 了解String类 常量对象:常量池中的数据 ...

  6. ADB——adb devices unauthorized

    我们只有在手机打开USB调试,并且允许电脑对其进行调试的前提下才可以用ADB进行自动化操作手机,如果出现unauthorized提示的话就是说明手机没有允许电脑对其调试 这个时候通常手机回弹出允许调试 ...

  7. 60道Python面试题&答案精选!找工作前必看

    需要Word/ PDF版本的同学可以在实验楼微信公众号回复关键词"面试题"获取. 1. Python 的特点和优点是什么? 答案:略. 2. 什么是lambda函数?它有什么好处? ...

  8. 极客时间 深入拆解java虚拟机 一至三讲学习总结

    为什么要学习java虚拟机 1.学习java虚拟机的本质,是了解java程序是如何被执行且优化的.这样一来,才可以从内部入手,达到高效编程的目的.与此同时,你也可以为学习更深层级.更为核心的java技 ...

  9. LigerUI之Grid使用详解(一)——显示数据 --分页

    http://www.cnblogs.com/jerehedu/p/4218560.html 首先给大家介绍最常用的数据展示组件Grid,使用步骤如下: 1.页面中正确引入样式文件及相应组件 < ...

  10. 图表管理账单的NABCD

    首先,我们团队的项目目标是记账本.就我个人理解,记账本中心功能有两项,第一,记录:第二,显示.而本篇博客主要描述用各种不同的图表来显示的NABCD. 首先是N(need),用户的需求就是我们的动力!利 ...