Hibernate学习之映射关系
一、Hibernate多对一关联映射:就是在“多”的一端加外键,指向“一”的一端。
比如多个学生对应一个班级,多个用户对应一个级别等等,都是多对一关系。

1、“多”端实体加入引用“一”端实体的变量及getter,setter方法。
比如说多个学生对应一个班级,在学生实体类加入:private Grade grade;
2、“多”端配置文件,student.hbm.xml里的标签设置:<many-to-one name="grade" column="gradeId" ></many-to-one>
二、Hibernate单向的一对一主键关联映射:就是让两个实体的主键一样,就不需要加入多余的字段了。
比如一个学生对应一个身份证号,一个学生对应一条户口信息等等,都是一对一关联映射。

1、Person实体里要持有IdCard的引用。在Person实体里加入属性:Private IdCard idCard;
2、Person端维护关系,所以需要重点看Person的配置文件,Person.hbm.xml通俗来讲 ,就是就是Person中的Id既为主键又为外键。
所以需要修改Person中的id标签:通俗来讲是告诉Person里的id去关联哪个实体里的id。此处的foreign生成策略,会取得关联对象的标识,property标签内是关联此处的对象。
<id name="id">
<generator class="foreign">
<param name="property">idCard</param>
</generator>
</id>
3、在Person.hbm.xml中添加关联关系的标签:<one-to-one name="idCard" constrained="true"><one-to-one/>
这里的one-to-one标签指示hibernate如何加载其关联对象,默认根据主键加载也就是拿到关系字段值,根据对端的主键来加载关联对象。这里的constrained="true"表示当前Person的id主键,还是一个外键,参照了对应端的IdCard的id主键,会生成外键约束语句。注:采用foreign映射策略在保存person对象的同时也会保存关联的对象,也就是idCard,他们之间还有级联关系。但是反之就不可以,也就是说,如果只保存IdCard对象,是会出错的,不会保存Person对象,因为关系的维护端在Person端,IdCard根本就不知道Person的存在。主键关联映射有弊端,不好维护。
三、Hibernate双向一对一关联映射:有些需求要求从一端可以查到另一端,从另一端又可以查到这一端,就需要双向的关联映射。
比如说,想要根据人的信息查到他的户口信息,也想根据户口信息查到这是哪个人的信息等。

1、修改对象模型,在IdCard.java 的实体里加入Person的引用,添加属性:private Person person;(在Person.java实体里也有IdCard的引用哦)
2、修改IdCard.hbm.xml文件,添加one-to-one标签。
<one-to-one name="person"/>
注1:one-to-one标签不影响存储,只影响加载,不会修改数据库,也就是说不会添加字段,而many-to-one会修改数据库,会增加一个字段。
注2:了解抓取策略:fetch="select" 可以控制查取数据的顺序。
四、单向一对一唯一外键关联映射:一对一主键关联不好维护,用外键关联对象比较好。原理:多对一的特殊情况。
比如说还是Person和IdCard的例子。
1、Person.java是实体里有IdCard的引用,即加入属性:private IdCard idCard;IdCard.java里没有Person引用。
2、配置文件:IdCard.hbm.xml里都是普通属性。Person.hbm.xml的主键生成策略需要改变:改回:
<generator class="native"/>
使用标签many-to-one和unique: <many-to-one name="idCard" unique="true"/> ,这样就限制了多的一端的唯一性。
注:这里需要先保存IdCard.否则报错。
五、双向一对一唯一外键关联:如果有需求要求的情况下,也可以建立双向的外键关联。
1、在Person和IdCard里添加对应端的引用,即添加相应属性。
2、person.hbm.xml和例子(四)中一样,修改IdCard.hbm.xml文件,添加one-to-one标签:<one-to-one name="person" property-ref="idCard"></one-to-one>.
注:必须指定one-to-one标签中的property-ref属性为关系字段的名称。
六、Hibernate单向一对多关联映射:让一的一端维护关系,和多对一的映射原理是一样的,都是在多的一端加入一个外键指向一的一端;
区别在于维护的关系不同:
- 多对一维护的关系:多指向一的关系,如果维护了多指向一的关系,那么加载多的一端的时候会把一的一端加载上来;
- 一对多维护的关系:一指向多的关系,如果维护了一指向多的关系,那么加载一的一端的时候会把多的一端加载上来。
比如说一个班里有多名学生。

1、Classes.java 和 Student.java里各有两个普通属性id和name。在Classes里加入新属性:private Set students;
2、映射文件的修改:Classes.hbm.xml里除了普通属性,加入集合映射:
<set name="students">
<key column="classesid"></key>
<one-to-many class="com.juyahong.hibernate.Student"/>
</set>
注1:“一”的一端维护关系。
注2:session.save(student),session.save(classes),保存student和classes对象。可以成功保存数据,但是需要发出多余的update语句来维持关系。
七、Hibernate双向一对多关联映射:让多的一端来维护关系。
主要是解决一对多单向关联的缺陷,而不是需求驱动的。

1、在Student.java实体类里添加Classes引用。private Classes classes;
2、Student.hbm.xml里添加many-to-one标签:<many-to-one name="classes" column="classesid"/>.Classes.hbm.xml在例子(六)里的那个的基础上加入反转属性inverse(以后将维护关系的工作交给了student),即就是一的一方不存在外键。
<set name="students" inverse="true">
<key column="classesid"></key>
<one-to-many class="com.juyahong.hibernate.Student"/>
</set>
注1:先保存classes,再保存student。
注2:一对多双向关联的映射方式:
- 在一的一端的集合上采用key标签,可以使得多的一端加入一个外键。
- 在多的一端采用many-to-one标签
注3:key标签和many-to-one标签加入的字段保持一致,否则会产生数据混乱。
注4:一对多关联映射通常在多的一端维护关系,让一的一端失效:
---inverse反转属性的使用:可以用在一对多和多对多双向关联上,inverse属性默认为false,即表示在本端可以维护关系,如果inverse为true,即表示本端不维护关系,要交给另一端来维护关系,本端失效。它是控制方向上的反转,只影响存储。
---cascade是操作上的连锁反应(暂时了解)。
八、Hibernate单向多对多关联映射:
比如学生和课程之间的关系,用户和角色之间的关系都是多对多关系。



1、User.java和Role.java实体类里都有两个普通属性id和name,在User.java里添加属性,private Set roles;
2、修改User.hbm.xml映射文件:映射集合:
<set name="roles" table="t_user_role">
<key column="user_id"/>
<many-to-many class="com.juyahong.hibernate.Role" column="role_id"/>
</key>
</set>
九、Hibernate双向多对多关联映射:


1、Role.java里加入新集合private Set users;
2、在例子八的基础上,修改Role.hbm.xml文件
<set name="users" table="t_user_role">
<key column="role_id"/>
<many-to-many class="com.juyahong.hibernate.User" column="user_id"/>
</key>
</set>
以上介绍了Hibernate中的七种映射关系(还包括映射主键和外键两种),在学习这一块的时候主要是能看懂UML图,在这些前提下,修改两个文件,一个模型类,还有一个映射文件。
转自:http://www.cnblogs.com/jyh317/p/3694844.html
Hibernate学习之映射关系的更多相关文章
- Hibernate的关联映射关系
一:多对一 <many-to-one 1.name:当前类的属性名(关联映射的类) 2.column:属性多对应的类的对应的表的外键(连接条件) 3.class:属性所对应的类的权限定名 4.n ...
- Hibernate学习笔记--映射配置文件详解
参考资料: http://blog.163.com/hzd_love/blog/static/13199988120108265317988/ http://www.cnblogs.com/often ...
- java框架篇---hibernate(一对多)映射关系
一对多关系可以分为单向和双向. 一对多关系单向 单向就是只能从一方找到另一方,通常是从主控类找到拥有外键的类(表).比如一个母亲可以有多个孩子,并且孩子有母亲的主键作为外键.母亲与孩子的关系就是一对多 ...
- Hibernate中的映射关系(一对多)
在数据库中表和表之间的关系有几种,(一对一,一对多,多对多)一对一关系:可以选择任意一方插入外键(one-to-one:one-to-one<--->many-to-one[unique= ...
- hibernate学习四(关系映射一对一与组件映射)
一.关系映射简介 在数据库中,表与表的关系,仅有外键.但使用hibernate后,为面向对象的编程,对象与对象的关系多样化:如 一对一,一对多,多对多,并具有单向和双向之分. 开始练习前,复制上一次项 ...
- Hibernate学习(二补充)关系映射----基于外键的双向一对一
刚刚写的是基于外键的单向一对一. 那么双向一对一就是在单向一对一的基础上稍微改动就可以了. account.java和account.hbm.xml都不用变动 只要我们小小的变动address.j ...
- hibernate学习五(关系映射多对一与一对多)
一.多对一 多对一(或者一对多):在学生与老师的情况下,一个老师可以教多个学生,但一个学生只能被教一个老师教: 对于类:在多的那方拥有一的那方的一个实体 二.修改student.java和teache ...
- hibernate笔记--继承映射关系的三种实现方式
单表继承映射(一张表): 假设我们现在有三个类,关系如下: Person类有两个子类Student和Teacher,并且子类都具有自己独有的属性.这种实体关系在hibernate中可以使用单表的继承映 ...
- java框架篇---hibernate(多对多)映射关系
以学生和老师为例的来讲解多对多映射. 实体类: Student package cn.itcast.g_hbm_manyToMany; import java.util.HashSet; import ...
随机推荐
- C++与AS3
ActionScript 3(简称AS3)与 c++ 都是面向对象的编程(OOP)语言,都具有OOP的特性如封装.继承.多态等.二者在语法上有许多相似之处,基本上学过C++之后再学习AS3感觉并不是特 ...
- 小Y的难题
Font Size:Aa Aa Aa Description 近期小Y迷上了数学,总是在思考各种数学问题.有一天,他不小心把墨水洒在草稿纸上.他如今能看到的是"2?3?1?4"(? ...
- JS 严格模式
标志 "use strict"; //老版本浏览器会自动忽略 调用 //整个文件调用 (function(){ "use strict"; })(); //单个 ...
- JavaScript引用类型之Array类型一
一.简介 除了Object之外,Array类型恐怕是ECMAScript中最常用的类型了.下面就来分析ECMAScript中的数组与其他语言中的数组的异同性: 1.相同点: (1)他们都是数据的有序列 ...
- JavaScript之面向对象学习四原型对象的动态性
1.由于在原型中查找值的过程是一次搜索,因此我们对原型对象所做的任何修改都能够立即从实例上反映出来---即便是先创建了实例后修改原型也是如此.代码如下: function Person(){ } va ...
- iOS开发通过代码方式使用AutoLayout (NSLayoutConstraint + Masonry)
iOS开发通过代码方式使用AutoLayout (NSLayoutConstraint + Masonry) 随着iPhone6/6+设备的上市,如何让手头上的APP适配多种机型多种屏幕尺寸变得尤为迫 ...
- [原创] 小而美 | Mac上鲜为人知,但极大提升效率的小工具
热爱收集实用又好用的软件,工具类软件不在多,发挥作用,提高效率最重要~推荐几个压箱底的藏货 一.Noizio -自然而然的白噪声,专注工作 Noizio是一款OS X 下的白噪音应用,可以让自己觉着是 ...
- C++_基础_C与C++的区别2
内容: (1)C++中的函数 (2)动态内存 (3)引用 (4)类型转换 (5)C++社区对C程序员的建议 1.C++中的函数1.1 函数的重载(1)重载的概念 在同一个作用域中,函数名相同,函数的参 ...
- VC++ SetLayeredWindowAttributes 部分窗口透明鼠标穿透
在初始化中使用下面两行代码 ModifyStyleEx(0, WS_EX_LAYERED); ::SetLayeredWindowAttributes(m_hWnd, RGB(1, 255, 0), ...
- 【原创】JPEG图像密写研究(二) 哈夫曼树的建立
[原创]记录自己研究的过程,仅供参考,欢迎讨论... 在根据JPEG图像文件结构读取完文件后,提取出其中DHT段,利用其中内容建立哈夫曼树,便于之后译码工作.这里需要注意的是文件中的哈夫曼表数量不固定 ...