对象-关系映射ORM(Object Relational Mapping)(转)
ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现
Hibernate在实现ORM功能的时候主要用到的文件有:映射类(*.java)、映射文件(*.hbm.xml)和数据库配置文件(*.properties/*.cfg.xml),它们各自的作用如下:
映射类(*.java):它是描述数据库表的结构,表中的字段在类中被描述成属性,将来就可以实现把表中的记录映射成为该类的对象了。
映射文件(*.hbm.xml):它是指定数据库表和映射类之间的关系,包括映射类和数据库表的对应关系、表字段和类属性类型的对应关系以及表字段和类属性名称的对应关系等。
数据库配置文件(*.properties/*.cfg.xml):它是指定与数据库连接时需要的连接信息,比如连接哪种数据库、登录数据库的用户名、登录密码以及连接字符串等。当然还可以把映射类的地址映射信息放在这里。
Hibernate的七种映射关系:
1、 单向一对一关联映射(one-to-one):
两个对象之间一对的关系,例如:Person(人)-IdCard(身份证)
有两种策略可以实现一对一的关联映射:
*主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联。如下图:

*唯一外键关联:外键关联,本来是用于多对一的配置,但是加上唯一的限制之后(采用<many-to-one>标签来映射,指定多的一端unique为true,这样就限制了多的一端的多重性为一),也可以用来表示一对一关联关系,其实它就是多对一的特殊情况。如下图:

注意:因为一对一的主键关联映射扩展性不好,当我们的需要发生改变想要将其变为一对多的时候变无法操作了,所以我们遇到一对一关联的时候经常会采用唯一外键关联来解决问题,而很少使用一对一主键关联。
2、 单向多对一关联映射(many-to-one):
多对一关联映射原理:在多的一端加入一个外键,指向一的一端,如下图:

关键映射代码——在多的一端加入如下标签映射:
<many-to-one name="group" column="groupid"/>
<many-to-one name="group" column="groupid"/>
3、 单向一对多关联映射(one-to-many):
一对多关联映射和多对一关联映射原理是一致的,都是在多的一端加入一个外键,指向一的一端。如下图(学生和班级):

注意:它与多对一的区别是维护的关系不同
*多对一维护的关系是:多指向一的关系,有了此关系,加载多的时候可以将一加载上来
*一对多维护的关系是:一指向多的关系,有了此关系,在加载一的时候可以将多加载上来
关键映射代码——在一的一端加入如下标签映射:
<set name="students">
<key column="classesid"/>
<one-to-many class="com.hibernate.Student"/>
</set> <set name="students">
<key column="classesid"/>
<one-to-many class="com.hibernate.Student"/>
</set>
缺陷:因为多的一端Student不知道Classes的存在(也就是Student没有维护与Classes的关系)所以在保存Student的时候关系字段classesid是为null的,如果将该关系字段设置为非空,则将无法保存数据,常用解决办法是改用双向关联映射,参见。
4、 单向多对多映射(many-to-many):
多对多关联映射新增加一张表才完成基本映射,如下图:

关键映射代码——可以在User的一端加入如下标签映射:
<set name="roles" table="t_user_role">
<key column="user_id"/>
<many-to-many class="com.hibernate.Role" column="role_id"/>
</set> <set name="roles" table="t_user_role">
<key column="user_id"/>
<many-to-many class="com.hibernate.Role" column="role_id"/>
</set>
5、 双向一对一关联映射:
对比单向一对一映射,需要在IdCard加入<one-to-one>标签,它不影响,只影响加载。如下图:

双向一对一主键映射关键映射代码——在IdCard端新加入如下标签映射:
<one-to-one name="person"/>
<one-to-one name="person"/>
双向一对一唯一外键映射关键映射代码——在IdCard端新加入如下标签映射:
<one-to-one name="person"property-ref="idCard"/>
<one-to-one name="person"property-ref="idCard"/>
注意:一对一唯一外键关联双向采用<one-to-one>标签映射,必须指定<one-to-one>标签中的property-ref属性为关系字段的名称
6、 双向一对多关联映射(非常重要):
采用一对多双向关联映射的目的主要是为了主要是为了解决一对多单向关联的缺陷而不是需求驱动的。
一对多双向关联的映射方式:
* 在一的一端的集合上采用<key>标签,在多的一端加入一个外键
* 在多的一端采用<many-to-one>标签
注意:<key>标签和<many-to-one>标签加入的字段保持一直,否则会产生数据混乱
关键映射代码:
在Classes的一端加入如下标签映射:
<set name="students"inverse="true">
<key column="classesid"/>
<one-to-many class="com.hibernate.Student"/>
</set> <set name="students"inverse="true">
<key column="classesid"/>
<one-to-many class="com.hibernate.Student"/>
</set>
在Student的一端加入如下标签映射:
<many-to-one name="classes" column="classesid"/>
<many-to-one name="classes" column="classesid"/>
注释:inverse属性
* inverse属性可以用在一对多和多对多双向关联上,inverse属性默认为false,为false表示本端可以维护关系,如果inverse为true,则本端不能维护关系,会交给另一端维护关系,本端失效。所以一对多关联映射我们通常在多的一端维护关系,让一的一端失效。
* inverse是控制方向上的反转,只影响存储
7、 双向多对多关联映射:
双向的目的就是为了两端都能将对方加载上来,和单向多对多的区别就是双向需要在两端都加入标签映射,需要注意的是:
* 生成的中间表名称必须一样
* 生成的中间表中的字段必须一样
Role(角色)端关键映射代码:
<set name="users" table="t_user_role">
<key column="role_id"/>
<many-to-many class="com.hibernate.User" column="user_id"/>
lt;/set> <set name="users" table="t_user_role">
<key column="role_id"/>
<many-to-many class="com.hibernate.User" column="user_id"/>
</set>
User(用户)端关键映射代码:
<set name="roles" table="t_user_role">
<key column="user_id"/>
<many-to-many class="com. hibernate.Role" column="role_id"/>
lt;/set> <set name="roles" table="t_user_role">
<key column="user_id"/>
<many-to-many class="com. hibernate.Role" column="role_id"/>
</set>
总结:对于上面这七种关联映射中,最重要的就是一对多的映射,因为它更贴近我们的现实生活,比如:教室和学生就可以是典型的一对多的关系,而我们开发软件的目的之一就是为了解决一些生活中重复性问题,把那些重复的问题交给计算机帮助我们完成,从而来提高我们的工作效率。一句话:生活离开不开编程,编程更离不开生活。
原文地址:http://blog.csdn.net/smszhuang168/article/details/7761310
对象-关系映射ORM(Object Relational Mapping)(转)的更多相关文章
- 一:ORM关系对象映射(Object Relational Mapping,简称ORM)
狼来的日子里! 奋发博取 10)django-ORM(创建,字段类型,字段参数) 一:ORM关系对象映射(Object Relational Mapping,简称ORM) ORM分两种: DB fir ...
- 对象关系映射ORM
对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从效 ...
- Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包
Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的, ...
- Python 3 对象关系映射(ORM)
ORM 对象关系映射 Object Relational Mapping 表 ---> 类 字段 ---> 属性 记录 ---> 对象 # mysql_client.py impor ...
- Django 源码小剖: Django 对象关系映射(ORM)
引 从前面已经知道, 一个 request 的到来和一个对应 response 的返回的流程, 数据处理和数据库离不开. 我们也经常在 views.py 的函数定义中与数据库打交道. django O ...
- 通过java反射实现简单的关于MongoDB的对象关系映射(ORM).
通过阅读MongoDB 3.2.1的官方文档中关于java 编程发现最新的文档并没有实现对对象到Document的映射,所以自己有了利用反射实现简单的关系映射. 1.定义抽象类:AbstractMo ...
- django关系对象映射(Object Relational Mapping,简称ORM)
Model 创建数据库,设计表结构和字段 django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表 from django.db import models clas ...
- 对象关系映射(ORM)框架GreenDao简介和基本使用
官网上的介绍,greenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案. GreenDao特点 性能最大化,可能是Android平台上最快的ORM框架 易于使用的A ...
- 对象关系映射 ORM
1.1 作用 MTV框架中包括一个重要的部分,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因 ...
随机推荐
- go bytes缓冲区使用介绍
缓冲区原理简介: go字节缓冲区底层以字节切片做存储,切片存在长度len与容量cap, 缓冲区写从长度len的位置开始写,当len>cap时,会自动扩容.缓冲区读会从内置标记off位置开始读(o ...
- 10300 - Ecological Premium
Problem A Ecological Premium Input: standard input Output: standard output Time Limit: 1 second Memo ...
- DXP 技巧和龙芯3A装机
时间过得好快!来公司已经半个月多了!本想着每日一搏,可是一再被耽搁,到今天才写.好了,废话不说了.就把自己这些天做的事写一些.理一理吧.也希望大家监督,由于水平有限,有不正确的地方,还望指正! 刚来做 ...
- hadoop Yarn 编程API
客户端编程库: 所在jar包: org.apache.hadoop.yarn.client.YarnClient 使用方法: 1 定义一个YarnClient实例: private YarnClien ...
- Java serialVersionUID
1.为什么要使用serialVersionUID (1)对于实现了Serializable接口的类,可以将其序列化输出至磁盘文件中,同时会将其serialVersionUID输出到文件中. (2)然后 ...
- XP系统VPN设置
为了解除公司上网策略限制,或者为了上Google,Facebook,都可以通过设置VPN实现. 要使用VPN需要到VPN服务商注册,链接VPN服务商. ======================== ...
- Student's Morning
sgu242:http://acm.sgu.ru/problem.php?contest=0&problem=242 题意:把n个人分到m组,每一组至少2个人,每个人只能属于一个组.一开始把题 ...
- C++ Prime:switch内部的变量定义
如果需要为某个case分支定义并初始化一个变量,我们应该把变量定义在块内,从而确保后面的所有case标签都在变量的作用域之外. case true: { // 正确,声明语句位于语句块内部 strin ...
- lambda -- Filter Java Stream to 1 and only 1 element
up vote10down votefavorite I am trying to use Java 8 Streams to find elements in a LinkedList. I wan ...
- 在html页面中利用ftp访问协议格式载入服务器图片
访问格式为:ftp://用户名:密码@服务器ip:服务器端口/具体文件路径 如下所示: <img src="ftp://lxj:123@127.0.0.1:21/IMG_2013051 ...