【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"属性, ...
随机推荐
- struts2解决动态多文件上传的问题(上传文件与数据库字段一一对应)(转)
struts2多文件上传我想只要会用struts2的朋友都不会陌生,但是怎么在action中根据用户上传的文 件把文件路径写到数据库中对应的字段上呢?ps:我的意思是这样,页面上有固定的5个上传文件的 ...
- FastDFS 工具类实现文件上传_02
一.jar 包 jar包下载:https://pan.baidu.com/s/1nwkAHU5 密码:tlv6 或者 下载工程,安装到 maven 本地仓库 工程下载:https://pan.baid ...
- linux内核(三)文件系统
1.为什么需要根文件系统 (1)init进程的应用程序在根文件系统上(2)根文件系统提供了根目录/(3)内核启动后的应用层配置(etc目录)在根文件系统上.几乎可以认为:发行版=内核+rootfs(4 ...
- 在JAVA中将class文件编译成jar文件包,运行提示没有主清单属性
在JAVA中将class文件编译成jar文件包,运行提示没有主清单属性 Maven 项目生成jar运行时提示“没有主清单属性” 新建了一个Maven的项目,mvn compile和mvn packag ...
- 揭秘Product Hunt怎样运用邮件崛起
Product Hunt正被硅谷热议,而大家谈论Product Hunt时,经常涉及邮件营销. Product Hunt由Ryan Hoover 在2013年11月创立.鼓舞人们发现和分享新产品的站点 ...
- Maven远程仓库:pom依赖以及jar包下载
Maven远程仓库:pom依赖xml配置以及jar包下载: 地址1: http://mvnrepository.com/ 地址2: http://172.16.163.52:8081/nexus/#w ...
- PHP简介 变量 输出
一.PHP概念 Hypertext Preprocessor 超文本预处理器,是一种开源脚本语言,语法吸收了C语言,Java,Perl的特点,用于web开发领域, PHP是将程序嵌入到Html文档中执 ...
- jquery简介 each遍历 prop attr
一.JQ简介 jQuery是一个快速.简洁的JavaScript框架,它封装了JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作.事件处理.动画设计和 ...
- 重温前端基础之-js排序算法
javascript数组常用的方法: push():返回值,数组新的长度 pop():返回值,被删除的数组末尾元素 shift():返回值,被删除的数组首部元素 unshift():返回值,数组新的长 ...
- CentOS 安装 MySQL8
@Linux 官网:https://dev.mysql.com/doc/refman/8.0/en/binary-installation.html 个人博客:https://www.xingchen ...