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

一对多关联映射

一个班级相应多个学生

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. NOIP2018提高组金牌训练营——搜索专题

    NOIP2018提高组金牌训练营——搜索专题 1416 两点 福克斯在玩一款手机解迷游戏,这个游戏叫做”两点”.基础级别的时候是在一个n×m单元上玩的.像这样: 每一个单元有包含一个有色点.我们将用不 ...

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

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

  3. vue路由传值params和query的区别

    vue路由传值params和query的区别1.query传参和接收参数传参: this.$router.push({ path:'/xxx' query:{ id:id } })接收参数: this ...

  4. input输入框获取焦点是背景黄色去除

    input:-webkit-autofill { -webkit-box-shadow: 0 0 0px 1000px white inset !important;}

  5. Jquery-select元素操作方法

    jQuery获取Select元素,并选择的Text和Value: $("#select_id").change(function(){//code...}); //为Select添 ...

  6. C#-MSMQ安装及配置

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  7. 安卓版微信自带浏览器和IE6浏览器ajax请求abort错误处理

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46419567 给页面元素绑定了一个click事件用来触发ajax请求.在安卓微信自 ...

  8. php给图片加入文字水印

    PHP对图片的操作用到GD库.这里我们介绍怎样给图片加入文字水印. 大致分为四步: 1.打开图片 2.操作图片 3.输出图片 4.销毁图片 以下我们上代码来详细解说每步的实现过程: <? php ...

  9. 安卓ProgressBar水平进度条的颜色设置

    安卓系统提供了水平进度条ProgressBar的样式,而我们在实际开发中,差点儿不可能使用默认的样式.原因就是"太丑"^_^ 所以我们在很多其它的时候须要对其颜色进行自己定义,主要 ...

  10. vue 路由demo2

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...