上篇博客主要介绍了一对一的关系,主要理解单向与双向的差别,主键关联与唯一外键关联的差别。以下继续介绍一对多与多对多关联。

一对多关联映射

一个班级相应多个学生

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1dGVuZ3RlbmcxMzA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

单向一对多关系

关系表:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1dGVuZ3RlbmcxMzA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

classes代码

<classname="com.bjpowernode.hibernat.Classes"table="t_classes">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"/> <setname="students">
<!--维护关系-->
<keycolumn="classesid"/>
<one-to-manyclass="com.bjpowernode.hibernate.Student"/>
</set>
</class>

student代码

<classname="com.bjpowernode.hibernate.student"table="t_student">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"/>
</class>

由班级维护关系,所以要在一的一端增加set标签。set用来存放集合。存放多个student对象。

一对多与多对一的差别:

一对多和多对一映射原理是一样的,都是在多的一端增加一个外键指向一的一端。事实上这个就跟我们在做ER模型中是一样的。把一的一端的主键放在多的一端当外键。

小结:

在一的一端维护关系也就是在Classes一端维护关系,Student端不维护关系,也就是Student不知道Classes的存在,所以在保存Student的时候关系字段classesid为null,假设将该关系字段设置为非空,将无法保存数据;另外假设要更新语句,那么每存在一个学生就要更新一条语句。从而保证Classes和Student有关系,这样载入Classes的时候才干够把该Classes相应的学生载入上来。

————————————————————————————————————————

双向一对多关系

因为一的一端维护关系效率并不高。为了解决单向一对多的缺陷,产生了双向一对多的关系。

关系表:

classes代码

<classname="com.bjpowernode.hibernat.Classes"table="t_classes">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"/> <setname="students" inverse="true">
<!--
<keycolumn="classesid" not-null="true"/>
-->
<keycolumn="classesid"/>
<one-to-manyclass="com.bjpowernode.hibernate.Student"/>
</set>
</class>

student代码

<classname="com.bjpowernode.hibernate.student"table="t_student">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"/>
<many-to-onename="classes" column="classesid"/>
</class>

双向一对多在多的一端维护关系增加外键。一的一端不维护关系,用inversekeyword反转更新,也就是一的一端不维护关系了,多的一端维护。同一时候在student端增加<many-to-one>标签

inverse属性:能够用在一对多和多对多双向关联上,inverse属性默觉得false,为false表示本端能够维护关系,
假设inverse为true,则本端不能维护关系,会交给还有一端维护关系。inverse属性石控制方向上的反转。仅仅影响存储;cascade是操作上的连线反应。

注意:<key>标签和<many-to-one>标签增加的字段要保持一致,否则会产生数据混乱。

双向和单向差别:

仅仅是维护关系的对象不同,单向通过一端维护关系。效率不高,通俗点就是。每一个学生都须要找自己的班级;而双向的是student维护关系。这时仅仅须要知道这个班级都有谁就能够了。

————————————————————————————————————————

多对多关联映射

也就是一个用户相应多个角色,一个角色相应多个用户。借助于第三张表

单向

关系表:

User维护关系。

User代码:

<classname="com.bjpowernode.hibernate.User" table="t_user">
<idname="id">
<generatorclass="native">
</id>
<propertyname="name">
<!--生成第三张关系表,当中主键为user_id,还有一个字段为role_id-->
<!--因为是多对多的关系。所以使用set集合-->
<setname="roles" table="t_user_role">
<keycolumn ="user_id"/>
<many-to-manyclass="com.bjpowernode.hibernate.Role"column="role_id"/>
</set>
</class>

Role代码:

<classname="com.bjpowernode.hibernate.Role" table="t_role">
<idname="id">
<generatorclass="native"/>
</id>
</class>

双向

关系表:

role关系

<classname="com.bjpowernode.hibernate.Role" table="t_role">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"/>
<setname="users" table="t_user_role">
<keycolumn="role_id"/>
<many-to-manyclass="com.bjpowernode.hibernate.User"column="user_id"/>
</set>
</class>

user关系

与role关系配置同样,同上。

小结:

单向关联是在user端持有role对象,role端并不持有user端对象,仅仅能从user端导航到role端,不能从role端导航到user端。双向关联是在单向基础上,加上role端持有user对象,所以在role端加上user对象的set集合。故双向关联是既能从user端导航到role端,也能从role端导航到user端。那么此时两端共同维护关系,对关联一側所做的改变,会马上影响到还有一側。

————————————————————————————————————————

简单来说,一对一关联是通过主外键来维持关系,多对多关联是通过第三张表来维持关系。普通情况下,为了降低数据的冗余我们都建立第三张表,可是有时候为了项目的须要能够适当有冗余或者是为了开发的速度就直接用一张表了。

【Hibernate学习】 ——ORM(二)的更多相关文章

  1. Hibernate学习笔记二

    Hibernate持久化类的编写规则 Hibernate是持久层的ORM映射框架,专注于数据的持久化工作.所谓持久化,就是将内存中的数据永久存储到关系型数据库中. 持久化类 一个java类与数据库表建 ...

  2. Hibernate学习(二)———— 一级缓存和三种状态解析

    一.一级缓存和快照 什么是一级缓存呢? 很简单,每次hibernate跟数据库打交道时,都是通过session来对要操作的对象取得关联,然后在进行操作,那么具体的过程是什么样的呢? 1.首先sessi ...

  3. Hibernate学习笔记二:Hibernate缓存策略详解

    一:为什么使用Hibernate缓存: Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序访问物理数据库的频次,从而提高应用程序的性能. 缓存内的数据是对物理数据源的复制,应用 ...

  4. Hibernate 学习(二)

    一.Hibernate 核心 API 1.Configuration 对象(配置) 配置对象是你在任何 Hibernate 应用程序中创造的第一个 Hibernate 对象,并且经常只在应用程序初始化 ...

  5. Hibernate学习(二)保存数据

    package cn.lonecloud.test; import java.util.Date; import org.hibernate.HibernateException; import or ...

  6. Hibernate学习笔记二:常用映射配置

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6760895.html 一:单向一对一 常用唯一外键的方法来配置单向一对一关系. 1:实体关系 类A中有类B对象 ...

  7. Hibernate学习(二)

    持久化对象的声明周期 1.Hibernate管理的持久化对象(PO persistence object )的生命周期有四种状态,分别是transient.persistent.detached和re ...

  8. Hibernate学习笔记(二)

    2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...

  9. 学习ORM框架—hibernate(三):跟踪持久化对象状态,掌握对象持久化

    准备工作 在上篇博客中学习ORM框架—hibernate(一):初识hibernate,通过简单的实例说明O和R的映射过程.本篇博客将要介绍hibernate中持久化对象的状态,并使用hibernat ...

  10. Hibernate学习(二)关系映射----基于外键的单向一对一

    事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似.只需要将原来的many-to-one元素增加unique="true"属性, ...

随机推荐

  1. linux下静态库的生成和使用

    一.静态库概念 1.库是预编译的目标文件(object  files)的集合,它们可以被链接进程序.静态库以后缀为”.a”的特殊的存档(archive file)存储. 2.标准系统库可在目录/usr ...

  2. 为什么要重写toString()方法

    因为在System.out.println(类的对象名)时,类的对象名是个引用,如果不重写,就输出引用地址. 其实实际是这样的System.out.println(类的对象名.toString()), ...

  3. httpclient就是个能发送http连接的工具包,包括能发送post请求和get请求

    1.httpclient就是个能发送http连接的工具包,包括能发送post请求和get请求. http 连接一次就有返回流.http是个双向的嘛.只有连接了,就会有输出返回流. 所以在执行http连 ...

  4. 少年 DXH

    少年 DXH 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描写叙述 大家都知道,DXH 幼时性格怪癖,小朋友都不喜欢和他玩,这样的情况一直到 DXH 的少年时期也没有改变. ...

  5. Android提高UI性能技巧

    提高UI性能的方法事实上有非常多在实际的开发中都已经用到了,在此做一下总结. 1.降低主线程的堵塞时间 若一个操作的耗时较长(超过5秒),我们应该将其放入后台线程中运行.仅仅在须要改动UI界面时通知主 ...

  6. struts2请求过程源代码分析

    struts2请求过程源代码分析 Struts2是Struts社区和WebWork社区的共同成果.我们甚至能够说,Struts2是WebWork的升级版.他採用的正是WebWork的核心,所以.Str ...

  7. Scrapy研究探索(六)——自己主动爬取网页之II(CrawlSpider)

    原创,转载注明:http://blog.csdn.net/u012150179/article/details/34913315 一.目的. 在教程(二)(http://blog.csdn.net/u ...

  8. bzoj1218: [HNOI2003]激光炸弹(DP二维前缀和)

    1218: [HNOI2003]激光炸弹 题目:传送门 题解: 一道经典题目啊... 为了更好的操作...把整个坐标系向右上角移动,从(1,1)开始 那么f[i][j]统计一下以(i,j)作为右上角, ...

  9. JAVA设计模式之【模板方法模式】

    模板方法模式 提高代码的复用性 把常用的基本方法放入父类中 强调一种流程步骤 角色 抽象类 抽象方法 具体方法 钩子方法 空方法 通过bool控制 具体类 看例子 1.银行模板类 package Te ...

  10. hihocoder 1407 重复旋律2

    思路: 二分一哈答案 height分个块 //By SiriusRen #include <cstdio> #include <cstring> #include <al ...