【Hibernate学习】 ——ORM(二)
上篇博客主要介绍了一对一的关系,主要理解单向与双向的差别,主键关联与唯一外键关联的差别。以下继续介绍一对多与多对多关联。
一对多关联映射
一个班级相应多个学生
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(二)的更多相关文章
- Hibernate学习笔记二
Hibernate持久化类的编写规则 Hibernate是持久层的ORM映射框架,专注于数据的持久化工作.所谓持久化,就是将内存中的数据永久存储到关系型数据库中. 持久化类 一个java类与数据库表建 ...
- Hibernate学习(二)———— 一级缓存和三种状态解析
一.一级缓存和快照 什么是一级缓存呢? 很简单,每次hibernate跟数据库打交道时,都是通过session来对要操作的对象取得关联,然后在进行操作,那么具体的过程是什么样的呢? 1.首先sessi ...
- Hibernate学习笔记二:Hibernate缓存策略详解
一:为什么使用Hibernate缓存: Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序访问物理数据库的频次,从而提高应用程序的性能. 缓存内的数据是对物理数据源的复制,应用 ...
- Hibernate 学习(二)
一.Hibernate 核心 API 1.Configuration 对象(配置) 配置对象是你在任何 Hibernate 应用程序中创造的第一个 Hibernate 对象,并且经常只在应用程序初始化 ...
- Hibernate学习(二)保存数据
package cn.lonecloud.test; import java.util.Date; import org.hibernate.HibernateException; import or ...
- Hibernate学习笔记二:常用映射配置
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6760895.html 一:单向一对一 常用唯一外键的方法来配置单向一对一关系. 1:实体关系 类A中有类B对象 ...
- Hibernate学习(二)
持久化对象的声明周期 1.Hibernate管理的持久化对象(PO persistence object )的生命周期有四种状态,分别是transient.persistent.detached和re ...
- Hibernate学习笔记(二)
2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...
- 学习ORM框架—hibernate(三):跟踪持久化对象状态,掌握对象持久化
准备工作 在上篇博客中学习ORM框架—hibernate(一):初识hibernate,通过简单的实例说明O和R的映射过程.本篇博客将要介绍hibernate中持久化对象的状态,并使用hibernat ...
- Hibernate学习(二)关系映射----基于外键的单向一对一
事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似.只需要将原来的many-to-one元素增加unique="true"属性, ...
随机推荐
- javascript深度克隆函数deepClone
javascript深度克隆函数deepClone function deepClone(obj) { var _toString = Object.prototype.toString; // nu ...
- Qt之二维码扫描
简述 二维码(QR Code)是用某种特定的几何图形按一定规律在平面(二维方向)分布的黑白相间的图形记录数据符号信息的.是所有信息数据的一把钥匙.应用十分广泛,如:产品防伪/溯源.广告推送.网站链接. ...
- 【LeetCode-面试算法经典-Java实现】【145-Binary Tree Postorder Traversal(二叉树非递归后序遍历)】
[145-Binary Tree Postorder Traversal(二叉树非递归后序遍历)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a bin ...
- HDU 5228 ZCC loves straight flush( BestCoder Round #41)
题目链接:pid=5228">ZCC loves straight flush pid=5228">题面: pid=5228"> ZCC loves s ...
- MongoDB 数据库下载和安装
MongoDB是一款非常流行的非关系型数据库,将面向对象数据存储做的非常好.这里就不具体介绍它的使用,本文主要解说怎样安装MongoDB数据库.把自己安装过程中碰到的问题和最后解决方法分享给大家,希望 ...
- 【跟我一步一步学Struts2】——拦截器
前言 前面提到过拦截器.而且说拦截器仅仅能拦截Action.这里拦截器的调用体现了责任链模式.为什么说体现了责任链模式呢? 以下的一段话说的非常明确: Struts2将整个运行划分成若干同样类型的元素 ...
- [Android] Android开发优化之——从代码角度进行优化
通常我们写程序,都是在项目计划的压力下完成的,此时完成的代码可以完成具体业务逻辑,但是性能不一定是最优化的.一般来说,优秀的程序员在写完代码之后都会不断的对代码进行重构.重构的好处有很多,其中一点,就 ...
- html表格设计
html部分,biaoge.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...
- [jzoj 5930] [NOIP2018模拟10.26】山花 解题报告 (质因数分类)
题目链接: http://172.16.0.132/senior/#contest/show/2538/2 题目: 小S决定从某一个节点$u$开始对其子树中与$u$距离小于$K$的节点代表的花树进行采 ...
- [原创]微信小程序 实现 圆环 百分百效果
1.最终效果 2.技术点:a. css3 clip-path , b.根据角度和直边计算另一个直边的长度 3.实现思路: a.3个层(灰色圆形层, 红色圆形层,白色圆形层) ,其中灰色和红色层大小一 ...