词汇解释

关系:事物之间相互作用、相互联系的状态。范围最大。

联系:在关系数据库中表示实体与实体之间的联系,1:1,1:n,m:n。

关联:表示对象之间的关系,既有数量性,又有方向性;动词:将对象之间通过某种方式联系起来。

映射:这里指java对象和数据库表的一种对应关系。动词:形成这种对应关系。

级联:有关系的双方中操作一方,另一方也将采取一些动作。

关联的联系种类

在不考虑关联的方向前提下,联系就是关系数据库中表示实体与实体之间的联系,1:1,1:n,m:n。

一对一联系(1:1):如用户和身份证、一夫一妻

一对多联系(1:n):如班级和学生

多对多联系(m:n):如学生和选课

关联的方向

关联关系的方向可分为单向关联和双向关联。

双向关联的方向其实就不重要了,因为通过任一一方都可以维护彼此的关系。也就是说:在双向关联中一对多和多对一都是一样的。

单向关联

在关联标记例如<many-to-one>或者<one-to-many>,方向都是从左到右,换句话说是由左边维护它们的关系,参见下面例子。

假设存在两张表person表和address表,它们之间的联系是n:1;

即一个人的居住地址是唯一的,一个地址却可以多个人居住。

如果在应用的业务逻辑中,仅需要每个person实例能够查询得到其对应的Address实例,而Address实例并不需要查询得到其对应的person实例。

<class name="Person" table="person">
<id name="id" >
<generator class="native"/>
</id>
<many-to-one name="address"
column="addressId"
not-null="true"/>
</class>
<class name="Address" >
<id name="id" column="addressId">
<generator class="native"/>
</id>
</class>

说明:

这是一个多对一的单向关联:由多的一方来维护它们的关系,需要在name="Person"的class元素内加入关联标记,<many-to-one>。这种关联非常多。

假设存在两张表person表和tel表,它们之间的联系是1:n;

即一个人的联系电话可能有多个,一个电话只能对应一个人。

如果在应用的业务逻辑中,我们仅仅关心每个person实例能够查询到其对应的所有tel实例,而tel实例并不需要查询得到其对应的person实例。

<class name="Person">
<id name="id" column="personId">
<generator class="native"/>
</id>
<set name="tels">
<key column="personId" not-null="true" />
<one-to-many class="Tel"/>
</set>
</class>
<class name="Tel">
<id name="id" column="telId">
<generator class="native"/>
</id>
</class>

说明:

这是一个一对多的单向关联:由一的一方来维护他们的关系,需要在name="Person"的class元素内加入关联标记,<one-to-many>。这种关联相对要少一些。大部分情况下我们都是操作多的一方的实例。

双向关联

在两边同时配置单向关联,就构成了双向管理。实际开发过程中,很多时候都是需要双向关联的,它在解决单向一对多维护关系的过程中存在的缺陷起了一定的修补作用。

假设存在两张表person表和address表,它们之间的联系是n:1;

即一个人的居住地址是唯一的,一个地址却可以多个人居住。

既需要每个person实例能够查询得到其对应的Address实例,Address实例也需要查询得到其对应的person实例。

<class name="Person">
<id name="id" column="personId">
<generator class="native"/>
</id>
<many-to-one name="address"
column="addressId"
not-null="true"/>
</class>
<class name="Address">
<id name="id" column="addressId">
<generator class="native"/>
</id>
<set name="people" inverse="true">
<key column="addressId"/>
<one-to-many class="Person"/>
</set>
</class>

说明:

这是一个多对一双向关联。由双方维护彼此的关系。需要在name="Person"的class元素内加入关联标记,<many-to-one>。同时在name="Address"的class元素内加入集合映射<set>,并在其中加入关联标记:<one-to-many>。

关联标记

在hbm.xml中,关联标记<one-to-one>、<many-to-one>、<one-to-many>、<many-to-many>,关联的方向都是是从左到右。

关联标记属性

简单介绍下面几个,除了name是必须,其余都是可选的。更多的我们参考官文档。

name="对应本类的属性名"

column="映射到本表的字段名"

class="映射到本表的实体类"

unique="ture|false":(数据库外键字段生成一个唯一约束)

not-null="ture|false"默认false(数据库外键字段是否允许为空值)

lazy="ture|false"默认proxy(延迟加载)

关于cascade(级联)属性

级联的意思是指定两个对象之间的操作联动关系,对一个对象执行了操作之后,对其指定的级联对象也需要执行相同的操作

总共可以取值为:all、none、save-update、delete

all-代表在所有的情况下都执行级联操作

none-在所有情况下都不执行级联操作

save-update-在保存和更新的时候执行级联操作

delete-在删除的时候执行级联操作

集合映射标记<set>

<set name="peoples" inverse="true">
<key column="addressId"/>
<one-to-many class="Person"/>
</set>

<set name="peoples" inverse="true">name为持久化对象的集合的属性名称。

<key column="classid" > column外键的名称

<one-to-many class=“cn.edu.bzu.hibernate.Student" /> class持久化类

关于inverse属性

控制反转,主要用在一对多,多对对双向关联上,inverse可以设置到<set>集合上, 默认inverse为false。为true表示反转,由对方负责;反之,不反转,自己负责;如果不设,one和many两方都要负责控制,因此,会引发重复的sql语句以及重复添加数据。

谁是多谁是一

我们说一对一,多对一,多对多是谁对谁呢?在映射文件(.hbm.xml)中class元素中的对象关联标记中,比如<many-to-one>

那么class元素的属性name就是many,<many-to-one>标记中 name就是one。同时column="addressId"指明了person表的外键。

<class name="Person" table="person">
<id name="id" >
<generator class="native"/>
</id>
<many-to-one name="address"
column="addressId"
not-null="true"/>
</class>

上面例子中Person就是many,address就是one。

可以这么理解<many-to-one>在谁里面,谁就是many,<many-to-one>的属性name就是one。

单向关联hbm.xml配置

单向关联常用的是多对一

单向 many-to-one 关联是最常见的单向关联关系。这种关联是数据库关系模式中的多对一:

这个表的一个外键引用目标表的主键字段。

下面例子中的person与address联系(数据库用语)为n:1,可以这么理解:

即一个人的居住地址是唯一的,一个地址却可以多个人居住。

<class name="Person" table="person">
<id name="id" >
<generator class="native"/>
</id>
<many-to-one name="address"
column="addressId"
not-null="true"/>
</class>
<class name="Address" >
<id name="id" column="addressId">
<generator class="native"/>
</id>
</class>

注意:<many-to-one>标签中column="addressId",为person表添加一个外键addressId。

sql输出:

create table Person ( personId bigint not null primary key, addressId bigint not null )
create table Address ( addressId bigint not null primary key )

双向关联hbm.xml配置

1.一对多/多对一

双向多对一关联 是最常见的关联关系。下面的例子解释了这种标准的父/子关联关系。

下面例子中的person与address联系(数据库用语)为n:1,可以这么理解:

即一个人的居住地址是唯一的,一个地址却可以多个人居住。

<class name="Person">
<id name="id" column="personId">
<generator class="native"/>
</id>
<many-to-one name="address"
column="addressId"
not-null="true"/>
</class>
<class name="Address">
<id name="id" column="addressId">
<generator class="native"/>
</id>
<set name="people" inverse="true">
<key column="addressId"/>
<one-to-many class="Person"/>
</set>
</class>

注意:many-to-one关联需要将one的一端加入inverse="true";column="addressId"指明了person表的外键。

sql输出:

create table Person ( personId bigint not null primary key, addressId bigint not null )
create table Address ( addressId bigint not null primary key )

2.一对一

基于外键关联的双向一对一关联也很常见。

下面例子中person与address的联系(数据库用语)是1:1,可以这么理解:

即一个人只能管理一个地方,一个地方只能由一个人管理。

column="addressId"指明了person表的外键。

<class name="Person">
<id name="id" column="personId">
<generator class="native"/>
</id>
<many-to-one name="address"
column="addressId"
unique="true"
not-null="true"/>
</class>
<class name="Address">
<id name="id" column="addressId">
<generator class="native"/>
</id>
<one-to-one name="person"
property-ref="address"/>
</class>

sql输出:

create table Person ( personId bigint not null primary key, addressId bigint not null unique )
create table Address ( addressId bigint not null primary key )

使用连接表的关联

使用连接表的关联通常针对多对多。连接表会是数据中另外建的一张表,来存储两个实体的联系。

这张表有三个字段:本身的id,两个外键分别关联到两个实体的主键。

下面是student与course的联系(数据库用语)是m:n,可以这么理解:

一个学生可以选多门课程,一门课程也有多个学生。

<class name="Student">
<id name="id" column="studentId">
<generator class="native"/>
</id>
<set name="courses" table="StudentCourse">
<key column="studentId"/>
<many-to-many column="courseId"
class="Course"/>
</set>
</class>
<class name="Course">
<id name="id" column="courseId">
<generator class="native"/>
</id>
<set name="students" inverse="true" table="StudentCourse">
<key column="courseId"/>
<many-to-many column="studentId"
class="Student"/>
</set>
</class>

注意:<set>增加了table属性,因此会另外建表。

sql输出:

create table Student ( studentId bigint not null primary key )
create table StudentCourse ( studentId bigint not null, courseId bigint not null, primary key
(studentId, courseId) )
create table Course ( courseId bigint not null primary key )

hibernate关联关系映射之配置文件的更多相关文章

  1. Hibernate关联关系映射

    1.  Hibernate关联关系映射 1.1.  one to one <class name="Person"> <id name="id" ...

  2. Hibernate关联关系映射之一对一关联关系

    人和身份证之间就是一个典型的一对一关联关系.实现一对一关联关系映射的方式有两种一种是基于外键,一种是基于主键,下面我们先看基于外键的关联方式 首先看他们的实体类 Person类 ? 1 2 3 4 5 ...

  3. hibernate关联关系映射详解

    词汇解释 关系:事物之间相互作用.相互联系的状态.范围最大. 联系:在关系数据库中表示实体与实体之间的联系,1:1,1:n,m:n. 关联:表示对象之间的关系,既有数量性,又有方向性:动词:将对象之间 ...

  4. Hibernate学习笔记(3)---hibernate关联关系映射

    一对一关联 假设有两个持久化类(实体类)User与Address,它们之间存在一对一的关系 1,通过主键关联(个人偏向另外一种) User.hbm.xml文件配置 <id name=" ...

  5. Hibernate关联关系映射之一对多双向映射

    一对多映射有两种,一种是单向的,另一种的多向.我们一般是使用双向的,所以我就写写一对多的双向映射. 还是想昨天一样举个例子来说明:作者<===>作品,还是对数据进行增删改查. 我们一般是把 ...

  6. Hibernate关联关系映射之一对一(主键关联)

    在业务成的域模型中,类和类之间最普遍的关系就是关联关系,而关联也是有方向的. 就以例子来说明:一个人对应一张身份证.对其进行增删改. 对于人在数据创建表的时候,我们就给他两个字段,一个是id号,一个就 ...

  7. 1-7 hibernate关联关系映射

    1.关联关系分为单向关联(一对一,一对多,多对一,多对多),多向关联(一对一,一对多,多对多). 2.单向一对一主键关联实例 需要为one-to-one元素指定constrained属性值为true. ...

  8. hibernate学习四 hibernate关联关系映射

    在Hibernate中对象之间的关联关系表现为数据库中表于表之间的关系(表之间通过外键关联). 1 单向的一对一 主键关联  外键关联 2 单向的一对多 3 单向的多对一 4 单向的多对多 5 双向的 ...

  9. Hibernate 关联关系映射实例

    双向多对一/一对多(many-to-one/one-to-many) 例子,多个学生对应一个班级,一个班级对应多个学生: 班级类,Grade.java: public class Grade { pr ...

随机推荐

  1. 2019西北工业大学程序设计创新实践基地春季选拔赛 I Chino with Rewrite (并查集+树链剖分+线段树)

    链接:https://ac.nowcoder.com/acm/contest/553/I 思路:离线整棵树,用并查集维护下联通的情况,因为值只有60个,用2的x(1<=x<=60)次方表示 ...

  2. 面试---Python中的模块和包是什么?

    python模块是: 自我包含并且有组织的代码片段为模块. 表现形式为:写的代码保存为文件.这个文件就是一个模块.sample.py 其中文件名smaple为模块名字. python包是: 包是一个有 ...

  3. [hexo]如何更换主题、删除文章

    如何修改主题 hexo有很多主题,每个人可以选择自己喜欢的主题来应用,也可以自己设计主题并且上传形成公共主题供大家下载. 如果是自己设计主题的话,会稍微麻烦一些,需要自己配置很多文件,并且编写css以 ...

  4. VSIX 插件右键菜单(2)

    编译项目然后发布 // 获取当前右击的活动项目 EnvDTE.Project activeProj = ProjectHelpers.GetActiveProject(); // 获取 编译选项 Re ...

  5. luogu5007 DDOSvoid 的疑惑 (树形dp)

    我们来算每个点出现在的集合的个数 设f[i]为i出现的集合个数,g[i]是只选子树i 可以有多少种选法 那就有$g[i]=1+\prod\limits_{j是i的孩子}{g[j]} , f[i]=f[ ...

  6. 中断 LET′S TRY“嵌入式编程”: 5 of 6

    中断 LET′S TRY“嵌入式编程”: 5 of 6 本连载讲解作为嵌入式系统开发技术人员所必需具备的单片机的基础知识.本期为最后一期,将为大家介绍在单片机控制系统中不可缺少的 处理方式--“中断” ...

  7. hdu1394逆序数(线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题目大意:逆序数:即假设在数组a中,假如i<j,但是a[i]>a[j]. 现在有一个 ...

  8. Sublime使用小记

    Jason转换插件: 多行编辑快捷键:Ctrl A全选,再按下 Ctrl Shift L (Command Shift L) 即可同时编辑这些行:鼠标选中文本,反复按 CTRL D (Command ...

  9. SpringBoot读取application.properties文件

    http://blog.csdn.net/cloume/article/details/52538626 Spring Boot中使用自定义的properties Spring Boot的applic ...

  10. 洛谷P1224 向量内积

    什么毒瘤...... 题意:给定n个d维向量,定义向量a和b的内积为 求是否存在两个向量使得它们的内积为k的倍数,并给出任一种方案.k <= 3. 解:很容易想到一个暴力是n2d的.显然我们不能 ...