【SSH】Hibernate关联映射
一对一关联映射
一对一主键关联映射
一句话:不加字段。主键既是主键又是外键。
一对一单向主键关联映射
配置:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><id name="id">
<!-- 採用foreign生成策略。forgeign会取得关联对象的标识 -->
<generator class="foreign">
<!-- property仅仅关联对象 -->
<param name="property">idCard</param> //參数为实体中的属性名称
</generator>
</id> <one-to-one name="idCard" constrained="true"/> //name:实体中的属性名称;constrained="true”:设置当前主键还是一个外键,參照了对端的主键(IdCard的主键)</span>
一对一双向主键关联映射
单向变成双向,仅仅须要在还有一端实体中也加入关联属性和还有一端配置文件里加入
<span style="font-family:KaiTi_GB2312;font-size:18px;"><one-to-one name=”person”/> //name:实体中的属性名称</span>
一对一唯一外键关联映射
一句话:加入一个外键字段,是还有一个的主键。
一对一单向唯一外键关联映射
配置和多对一一样,仅仅是在配置中加入一个唯一限制条件,这样就实现了加入外键字段和一对一关联映射了。
<many-to-one name=”idCard”
unique=”true”>
一对一双向唯一外键关联映射
单向变成双向,仅仅须要在还有一端实体中也加入关联属性和还有一端配置文件里加入
<span style="font-family:KaiTi_GB2312;font-size:18px;"><one-to-one name=”person” property-ref=”idCard”> // property-ref:指定关系字段的名称</span>
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
一对多关联映射
一句话:和多对一的表结构和映射原理一样,都是在多端加入外键是一的主键。
一对多单向关联映射
关系维护在“一”一端(以后简称“一端”和“多端”)
在一端配置:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><set name="students">
<key column="classesid"/> //字段名称,且此处不能设置not-null="true"
<one-to-many class="com.bjpowernode.hibernate.Student"/> //多端实体完整路径
</set></span>
一对多双向关联映射
关系维护在多端
单向变成双向
一端配置:在一端设置inverse="true"就不维护关系了,交给多端维护
<span style="font-family:KaiTi_GB2312;font-size:18px;"><set name="students" inverse="true">
<key column="classesid"/> //key标签:在多端加入外键
<one-to-many class="com.bjpowernode.hibernate.Student"/>
</set></span>
多端配置:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><many-to-one name="classes" column="classesid"/> //<key>和<many-to-one>标签加入的字段保持一致,否则会产生数据混乱</span>
多对一关联映射
一句话:在多端加入外键是一的主键
方向:从多能看到一,一看不到多
关系维护:在多端。多端实体中加入关联属性
配置:在多的一端配置。用<many-to-one>标签,设置cascade(级联)能够将关联对象一起保存。
<span style="font-family:KaiTi_GB2312;font-size:18px;"><many-to-one name="group" column="groupid" cascade="save-update"/> //name:实体中的属性名称,column:数据库中加入字段的名称。 </span>
具体解释:
cascade(级联):指定两个对象之间的操作联动关系,对一个对象运行操作后,对其指定的级联对象也须要运行同样的操作。
取值:
all:代表在全部的情况下都运行级联操作
none:在全部的情况下都不运行级联操作
save-update:在保存和更新的时候运行级联操作
delete:在删除的时候运行级联操作
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
多对多关联映射
多对多单向关联映射
配置:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><set name="roles" table="t_user_role"> //加入表
<key column="user_id" not-null="true" /> //表中加入字段,此列即作为主键又作为外键。必须不能为空,字段名:user_id
<many-to-many class="com.bjpowernode.hibernate.Role" column="role_id" /> //加入字段role_id
</set></span>
多对多双向关联映射
单向变双向,仅仅须要在还有一端也加上实体关系和配置关联映射,且配置的表名和字段名都必须同样。
配置:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><set name="users" table="t_user_role"> //表名
<key column="role_id" not-null="true"/>//字段名:role_id
<many-to-many class="com.bjpowernode.hibernate.User" column="user_id"/> //字段名:user_id
</set></span>
继承映射
每颗类继承树使用一个表
一句话:全部的对象放到一张表中,须要加入鉴别字段
长处:一张表。查询效率高
缺点:easy出现冗余
配置(在父类中配置):
<span style="font-family:KaiTi_GB2312;font-size:18px;"><discriminator column="type" type="string"/> //加入鉴别字段
<subclass name="Pig" discriminator-value="P"> // subclass:定义子类标签,扩展映射,加入对应的鉴别值(discriminator-value);name:为子类的全路径名(若外面已经设置路径。则仅仅须要填写类名)
<property name="weight"/>
</subclass>
<subclass name="Bird" discriminator-value="B">
<property name="height"/>
</subclass></span>
每个类一个表
一句话:主键既是主键也是外键
长处:层次清楚
缺点:当关联多了的时候,会影响效率
配置:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><joined-subclass name="Pig" table="t_pig"> //加入表
<key column="pid"/> //表中加入字段,作为主键也作为外键。指向父表的主键
<property name="weight"/>
</joined-subclass>
<joined-subclass name="Bird" table="t_bird">
<key column="bid"/>
<property name="height"/>
</joined-subclass></span>
每一个具体类一个表
缺点:不能使用自增主键
配置:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><class name="Animal" table="t_animal" abstract="true"> // animal类设置成抽象的就不会生成出此表。
<id name="id">
<generator class="assigned"/> //assigned让程序在save之前为对象分配一个标识符,不自己主动生成主键
</id>
<property name="name"/>
<property name="sex"/>
<union-subclass name="Pig" table="t_pig">
<property name="weight"/>
</union-subclass>
<union-subclass name="Bird" table="t_bird">
<property name="height"/>
</union-subclass>
</class></span>
其它映射:
复合主键映射
加入一个主键实体类,实现序列化(Serializable)接口,重写equals和hashCode方法
配置(主要是复合主键的配置):
<span style="font-family:KaiTi_GB2312;font-size:18px;"><composite-id name="fiscalYearPeriodPK">
<key-property name="fiscalYear"/>
<key-property name="fiscalPeriod"/>
</composite-id></span>
component映射
一句话:将公共的一些属性放到一个实体中,但这个实体不生成表。用关联联系起来。(三个实体。两张表)
长处:实现对象模型的细粒度划分,复用率更高。含义明白,层次分明
配置:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><component name="userContact"> // component是某个实体的逻辑组成部分,它与实体类的主要区别在于,它没有oid。
<property name="email"/>
<property name="address"/>
<property name="zipCode"/>
<property name="contactTel"/>
</component></span>
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
集合映射
一句话:一个实体。实体中的每一个集合都是一张表
配置:
set集合使用set标签。加入表,加上主键(即外键),普通字段使用element。存储类使用composite-element。
<span style="font-family:KaiTi_GB2312;font-size:18px;"><set name="setValues" table="t_set_values">
<key column="set_id"/>
<element type="string" column="set_value" not-null="true"/>
<!--
<composite-element class=""></composite-element>
-->
</set></span>
list集合使用list标签。加入表,加上主键(即外键)。普通字段使用element,存储索引:list-index,base表示索引开头值。
<span style="font-family:KaiTi_GB2312;font-size:18px;"><list name="listValues" table="t_list_values">
<key column="list_id"/>
<list-index column="list_index"/>
<element type="string" column="list_value"/>
</list></span>
Array集合使用array标签。加入表,加上主键(即外键)。普通字段使用element,存储索引:list-index。
<span style="font-family:KaiTi_GB2312;font-size:18px;"><array name="arrayValues" table="t_array_values">
<key column="array_id"/>
<list-index column="array_index"/>
<element type="string" column="array_value"/>
</array></span>
Map集合使用map标签,加入表。加上主键(即外键)。key值使用map-key标签,value值使用element标签
<span style="font-family:KaiTi_GB2312;font-size:18px;"><map name="mapValues" table="t_map_values">
<key column="map_id"/>
<map-key type="string" column="map_key"/>
<element type="string" column="map_value"/>
</map></span>
总结
- 维护关系端在哪就在哪端实体中加入关联属性(单向关联映射),若两端都维护关系(双向关联映射),则两方实体中都加入关联属性。
若加入的关联属性为多端,则使用集合。
- column:填写字段名称
3、many-to-one和one-to-one:many-to-one会影响数据库的表结构(加入字段)。且要维护字段值;one-to-one不维护字段值,仅仅维护载入。
4、使用关联映射。载入对象,就能够将其关联对象也载入出来,就不须要再使用sql语句进行查询了。
【SSH】Hibernate关联映射的更多相关文章
- Hibernate关联映射关系
Hibernate关联映射关系 一.双向一对多关联映射关系:当类与类之间建立了关联,就可以方便的从一个对象导航到另一个或另一组与它关联的对象(一对多双向关联和多对一双向关联是完全一样的) 1.1创建实 ...
- Oracle primary,unique,foreign 区别,Hibernate 关联映射
Oracle primary,unique,foreign 区别 转:http://www.cnblogs.com/henw/archive/2012/08/15/2639510.html NOT N ...
- 第六章 Hibernate关联映射
第六章 hibernate关联映射一.本章知识点分为2部分:1.关联关系:单向多对一关联关系,双向一对多关联关系(含一对多关联关系),多对多关联关系2.延迟加载:类级别加载策略,一对多加载策略,多对一 ...
- 【学习笔记】Hibernate关联映射(Y2-1-6)
Hibernate关联映射 关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用. 1.单向多对一关联 准备数据库 部门表和员工表 其中部门表有两列 部门编号和名称 员工表有三列 员工 ...
- 第三章Hibernate关联映射
第三章Hibernate关联映射 一.关联关系 类与类之间最普通的关系就是关联关系,而且关联是有方向的. 以部门和员工为列,一个部门下有多个员工,而一个员工只能属于一个部门,从员工到部门就是多对一关联 ...
- (转)Hibernate关联映射——对象的三种关系
http://blog.csdn.net/yerenyuan_pku/article/details/70148618 Hibernate关联映射——对象的三种关系 Hibernate框架基于ORM设 ...
- (转)Hibernate关联映射——一对多(多对一)
http://blog.csdn.net/yerenyuan_pku/article/details/70152173 Hibernate关联映射——一对多(多对一) 我们以客户(Customer)与 ...
- Hibernate关联映射(一对多/多对多)
版权声明:翀版 https://blog.csdn.net/biggerchong/article/details/843401053. Hibernate关联映射上接Hibernate持久化类:h ...
- Java三大框架之——Hibernate关联映射与级联操作
什么是Hibernate中的关联映射? 简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射. 它将数据库中的表映射成对应的 ...
随机推荐
- Linux下使用logrotate实现日志切换
运维过程中经常会发现一些 C 程序,每天会生产这样的日志: /home/admin/app_name/logs/access_log 那么天长地久,如果这个程序不会自动去轮转这个日志,那么这个日志文件 ...
- Linq to entity 执行多个字段排序的方法
可以连续使用:OrderBy,ThenBy 或者 OrderByDescending,ThenByDescending var data = db.User .Where(u => u.User ...
- windows命令行 批量对源代码添加版权头/头信息
简短精悍的代码,特别适合开源项目使用. for /r %%F in (*.as) DO ( move "%%F" tmp.txt type copyright.txt > & ...
- 从头開始学 RecyclerView(三) 封装简化
前言 上一篇的代码,也是基于这些封装的. RV的封装,跟曾经的listView之类的封装,大同小异. 这里,从@devwiki 处,将代码搬过来.基本无改动 BaseHolder的优化 使ViewHo ...
- 【Linux】文件夹及作用说明
Tips Linux关机注意事项: 远程重启服务前,先停止相关服务 使用安全命令重启shutdown –r now,该命令在重启时会正常保存和终止服务器上正在运行的程序 不建议在本地直接对远程服务器关 ...
- Android(4.0.3+): Service, AsyncTask, 定时任务和UI通信
Service使用AlarmManager实现后台定时任务 在Android 4.0.3版本中, 使用AlarmManager实现后台定时任务是比较好的方案, 其实现机制, 是利用Service的 o ...
- 【LeetCode】206. Reverse Linked List (2 solutions)
Reverse Linked List Reverse a singly linked list. click to show more hints. Hint: A linked list can ...
- SQLDumpSplitter sql文件分割工具
数据库误操作,只好使用使用原来的备份数据去恢复数据,但是数据量太大,只好使用SQLDumpSplitter将大文件分割成小文件,然后恢复指定的表即可.
- 自由是有代价的:聊聊这几年尝试的道路 要想生活好,别看哲学书和思想书。简单看看可以,看多了问题就大了。还是要去研究研究些具体的问题。别jb坐在屋子里,嘴里念着海子的诗,脑袋里想康德想的事情,兜里屁都没有,幻想自己是大国总理,去想影帝是怎么炼成的。
自由是有代价的:聊聊这几年尝试的道路 现在不愿意写过多的技术文章了,一点是现在做的技术比较偏,写出来看的人也不多,二来是家庭事务比较繁多,没以前那么有时间写了.最近,园子里多了一些写经历的文章,我也将 ...
- java 实现二分法
http://www.cnblogs.com/vanezkw/archive/2012/06/29/2569470.html JDK里面的二分法实现.二分法的实现有多种今天就给大家分享两种.一种是递归 ...