Hibernate框架(三)框架中的关系映射
在设计数据库时我们会考虑,表与表之间的关系,例如我们前边经常提到的一对一,一对多,多对多关系,在数据库中我们通过外键,第三张表等来实现这些关系。而Hibernate时间实体类和数据库中的表进行的映射,这些关系如何映射呢?这里简单总结一下:
一,一对多,多对一关系映射,这里拿学生和班级进行简单演示:
1,学生的类和对应的映射文件的编写:
- private int sid ;
- private String sname ;
- private Classes classes ; //,引入班级对象,多对一
- <class name="com.ljh.hibernate.pojo.Student" table="t_student" lazy="false">
- <id name="sid" column="sid">
- <generator class="native"/>
- </id>
- <property name="sname" column="sname" type="java.lang.String" length="20" not-null="true"/>
- <!--
- 表示对象的关系:多对一
- name 表示当前类的关系对象
- column 表示数据库中外键字段(也是描述数据关系)
- class 表示name属性值的类型
- cascade 级联
- 主动方所做的操作(insert,update,delete),被动方也跟着做相同的操作。
- 取值:save-update、delete 、all
- save-update : 保存或更新当前对象时,级联保存或更新关联对象
- delete : 删除当前对象时,级联删除关联对象
- all : 包含save,update,delete三种操作。
- 对于多对一的场合,级联不能使用delete和all,否则会违背数据关系完整性。
- lazy : 延迟加载
- 延迟初始化对象信息,等使用对象时再查询数据库。
- false : 禁用延迟加载
- proxy : 使用延迟加载(默认值),采用cglib代理完成延迟加载的扩展功能。
- no-proxy : 不使用代理,完成延迟加载 。可以使用第三方字节码增强工具。
- fetch : 数据抓取策略 :根据主动方,查询被动方时所采用的查询方式。
- fetch="select" 默认值,会采用多条语句的方式查找,往往会延迟加载数据
- fetch="join" 默认会采用左连接查询数据,不会延迟加载数据。
- not-null 如果取值为true,那么框架采用内连接查询数据。
- -->
- <many-to-one name="classes" column="cid" cascade="save-update" lazy="no-proxy" fetch="join" not-null="true" class="com.ljh.hibernate.pojo.Classes"></many-to-one>
- </class>
2,班级的实体类和对应的映射文件:
- private int cid ;
- private String cname ;
- private Set<Student> studentSet = new HashSet<Student>(); //引入学生类的集合,一对多
- <class name="com.ljh.hibernate.pojo.Classes" table="t_classes" >
- <id name="cid" column="cid">
- <generator class="native"/>
- </id>
- <property name="cname" column="cname" type="java.lang.String" length="20" not-null="true"/>
- <!-- 声明 一对多映射
- lazy : 延迟加载
- false : 禁用延迟加载
- true : 延迟加载(默认值)
- extra : 支持延迟加载的。(推荐)
- 当获取集合自身信息时,可以发送高效的查询语句。
- 例如:只希望获取集合的长度,而不需要获取集合中数据的信息,框架会通过函数执行查询进行计算集合长度。。
- fetch : 数据抓取策略
- 查询关联对象的数据时,所采用的查询方式。
- join : 通过一条连接语句进行立即查询。(延迟加载不起作用)
- select : 通过多条查询语句进行查询。
- subselect : 通过子查询语句进行立即查询。 (不推荐使用)(默认情况下和select取值结果相同)
- not-null="true" 对于一对多的查询,即使设置了not-null语句,依然采用左连接查询。
- Inverse="true",表示控制反转,由对方也就是学生方来进行管理外键。因为外键在学生
- -->
- <set name="studentSet" cascade="all" inverse="true" fetch="subselect">
- <key column="cid" not-null="true"></key>
- <one-to-many class="com.bjpowernode.hibernate.pojo.Student"/>
- </set>
- </class>
二,自关联:就是在自己的类进行关联自己,例如父菜单与子菜单的关系,对应的实体类,和映射文件
- private int mid ; private String name ;
- private Set<Menu> menuSet = new HashSet<Menu>(); //父菜单与子菜单的关系为:一对多
- private Menu pmenu ; //子菜单和父菜单的关系为:多对一
- <class name="com.ljh.hibernate.pojo.Menu" table="t_menu" >
- <id name="mid" column="mid">
- <generator class="native"/>
- </id>
- <property name="name" column="name" type="java.lang.String" length="20" not-null="true"/>
- <many-to-one name="pmenu" column="m_id" cascade="save-update"></many-to-one>
- <!--
- 自关联表的设计:外键字段不能为非空。
- -->
- <set name="menuSet" cascade="all" inverse="true">
- <key column="m_id"></key>
- <one-to-many class="com.ljh.hibernate.pojo.Menu"/>
- </set>
- </class>
三,一对一关系映射:
1,假如是主键一对一用来映射:也就是说被动方的主键是来自于主动方的主键,也可以将之称之为外键:
类之间相互添加彼此的应用。
映射文件中主动方,增加一对一标签:
- <one-to-one name="userinfo" cascade="all" class="com.ljh.hibernate.pojo.UserInfo"></one-to-one>
- 被动方,主键又是外键,也添加一对一的映射标签:
- <id name="uid" column="uid">
- <generator class="foreign">
- <param name="property">user</param>
- </generator>
- </id>
- <!--
- 描述一对一关系关系映射
- constrained="true" : 表示强制要求一对一使用外键关联。增加外键约束。
- -->
- <one-to-one name="user" constrained="true" class="com.ljh.hibernate.pojo.User"></one-to-one>
2,使用外键约束,其实是多对一的特殊情况,例如学生对班级,
类添加彼此的应用。
映射文件中学生端主动端,添加外键进行约束,添加多对一标签,
- <!--
- unique : 唯一约束
- 如果外键含有unique约束,那么表示主动方和被动方的关系为一对一。
- 对于一对一映射来讲,可以设置级联关系为delete 和 all
- 根据主动方查询被动方关联数据,是支持延迟加载的。
- -->
- <many-to-one name="classes" column="cid" unique="true" cascade="all" class="com.ljh.hibernate.pojo.Classes"></many-to-one>
- 班级端的映射文件:添加一对一的标签:
- <one-to-one name="student" cascade="all" property-ref="classes" class="com.ljh.hibernate.pojo.Student"></one-to-one>
四,多对多的关系,例如学生对课程的对应,在数据库中会生成第三张表进行维护:
在各自的类中引入对方的set集合,表示多对多。
学生端:
- <set name="courseSet" table="t_student_course" cascade="save-update">
- <key column="sid"></key>
- <many-to-many class="com.ljh.hibernate.pojo.Course" column="cid"></many-to-many>
- ;/set>
课程端:
- <!--
- 对于多对多来讲,级联只能设置cascade="save-update"是合理的
- inverse="true" 让集合一端去维护中间表数据。任意一端都可以。
- -->
- <set name="studentSet" table="t_student_course" cascade="save-update" inverse="true">
- <key column="cid"></key>
- <many-to-many class="com.ljh.hibernate.pojo.Student" column="sid"></many-to-many>
- </set>
五,联合主键的映射,这种情况很少见,看一下如何吧,
出现了这种联合键时,需要我们为其定义一个联合主键的类(实现Serializable接口),类中声明多个字段的属性,表示联合主键字段。
在配置映射文件时,主键的配置利用联合主键的标签即可:
- composite-id name="id"> <key-property name="title"></key-property>
- <key-property name="author"></key-property>
- </composite-id>
综上,为Hibernate中对数据库进行关联设置映射时的几个简单例子,主要是我们根据实际情况,掌握几个对应标签的使用,还有就是里边的属性的使用。像lazy,cascade,fetch等等。注意观察其中的不同。这样进行了关联设置我们就可以很好的,根据类生成数据库,对数据库中的数据进行关联操作,更加合理化!
Hibernate框架(三)框架中的关系映射的更多相关文章
- JavaEE之Hibernate(开放源代码的对象关系映射框架)
Hibernate(开放源代码的对象关系映射框架) 1.简介 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全 ...
- Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite
Android数据库框架--GreenDao轻量级的对象关系映射框架,永久告别sqlite 前不久,我在写了ORMLite这个框架的博文 Android数据库框架--ORMLite轻量级的对象关系映射 ...
- Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包
Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的, ...
- Hibernate(三)——框架中的关系映射
在设计数据库时我们会考虑,表与表之间的关系,例如我们前边经常提到的一对一,一对多,多对多关系,在数据库中我们通过外键,第三张表等来实现这些关系.而Hibernate时间实体类和数据库中的表进行的映射, ...
- Hibernate(开放源代码的对象关系映射框架)
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自 ...
- Hibernate框架之双向多对多关系映射
昨天跟大家分享了Hibernate中单向的一对多.单向多对一.双向一对多的映射关系,今天跟大家分享下在Hibernate中双向的多对多的映射关系 这次我们以项目和员工举个栗子,因为大家可以想象得到,在 ...
- Hibernate 中对象关系映射(ObjectRelationMapping)
1.什么是对象关系映射? 解析:对象-关系映射(Object Relational Mapping,简称ORM,对象关系映射)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说, ...
- Hibernate学习笔记(四)关系映射之一对一关联映射
一. 一对一关联映射 ² 两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ² 有两种策略可以实现一对一的关联映射 Ø 主键关联:即让 ...
- Hibernate学习笔记(五) — 多对多关系映射
多对多关系映射 多对多建立关系相当于在第三张表中插入一行数据 多对多解除关系相当于在第三张表中删除一行数据 多对多改动关系相当于在第三张表中先删除后添加 多对多谁维护效率都一样.看需求 在实际开发过程 ...
随机推荐
- Linux进阶之RAID磁盘阵列、系统启动及dd命令
本节内容 1. 磁盘阵列 RAID0: 条带卷 2+ 100% 读写速度快,不容错 RAID1: 镜像卷 2 50% 读写速度慢,容错 RAID5: 奇偶校验条带卷 3 读写速度快,容错 ...
- ubuntu中安装qgit工具-(转自Linux中国)
QGit是一款由Marco Costalba用Qt和C++写的开源的图形界面 Git 客户端.它是一款可以在图形界面环境下更好地提供浏览版本历史.查看提交记录和文件补丁的客户端.它利用git命令行来执 ...
- 安装beanstalkd队列问题——No package beanstalkd available
CentOS7.4安装beanstalkd 时无可用源 No package beanstalkd availableError:Nothing to do 可从以下获取:wget /etc/yum. ...
- Navigation 实现不同fragment之间的view的共享(含动画过渡)
以imageView的共享举例 两个fragment都要有各自的imageview视图,id可以不同,但transitonName一定要相同, 都要指定相同的src 例如: fragment A &l ...
- python实现给字典添加条目的方法
具体实现方法如下: def addWord(theIndex,word,pagenumber): theIndex.setdefault(word, [ ]).append(pagenumber)#存 ...
- C#基础之GetType 与 typeof的区别
C#中GetType 与 typeof的区别 在实际开发中经常需要了解具体对象的类型,所以经常会使用GetType()和typeof().尽管可以得到相应的类型.但两者之间也存在一些差别,接下来我 ...
- 写Bug时,需要注意的几点 02
重构2-重新组织函数 重构的基本技巧--小步前进,频繁测试. 模式是你希望到达的目标,重构则是到达之路. 在单进程软件中,你永远不必操心多么频繁地调用某个函数,因为函数的调用成本很低.但在分布式软件中 ...
- python基础知识笔记(二) (出现语法以及颜色问题)
以下是在学习Python时需要尤其要注意的点: 1.程序中出现中文,运行的时候出现如下错误: SyntaxError: Non-UTF-8 code starting with '\xc1' 则是编码 ...
- YOLOv3和YOLOv4长篇核心综述(上)
YOLOv3和YOLOv4长篇核心综述(上) 对目标检测算法会经常使用和关注,比如Yolov3.Yolov4算法. 实际项目进行目标检测任务,比如人脸识别.多目标追踪.REID.客流统计等项目.因此目 ...
- GitHub上开源的YOLOv5
GitHub上开源的YOLOv5 代码地址:https://github.com/ultralytics/YOLOv5 该存储库代表Ultralytics对未来的对象检测方法的开源研究,并结合了我们在 ...