读书人

Hibernate投射解析七种映射关系

发布时间: 2012-07-30 16:19:05 作者: rapoo

Hibernate映射解析——七种映射关系
首先我们了解一个名词ORM,全称是(Object Relational Mapping),即对象关系映射。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对数据库的操作转化为对这些对象的操作。Hibernate正是实现了这种思想,达到了方便开发人员以面向对象的思想来实现对数据库的操作。

Hibernate在实现ORM功能的时候主要用到的文件有:映射类(*.java)、映射文件(*.hbm.xml)和数据库配置文件(*.properties/*.cfg.xml),它们各自的作用如下。

映射类(*.java):它是描述数据库表的结构,表中的字段在类中被描述成属性,将来就可以实现把表中的记录映射成为该类的对象了。

映射文件(*.hbm.xml):它是指定数据库表和映射类之间的关系,包括映射类和数据库表的对应关系、表字段和类属性类型的对应关系以及表字段和类属性名称的对应关系等。

数据库配置文件(*.properties/*.cfg.xml):它是指定与数据库连接时需要的连接信息,比如连接哪种数据库、登录数据库的用户名、登录密码以及连接字符串等。当然还可以把映射类的地址映射信息放在这里。

接下来让我们就一起走进Hibernate的七种映射关系:

1、 单向一对一关联映射(one-to-one):

两个对象之间一对的关系,例如:Person(人)-IdCard(身份证)

有两种策略可以实现一对一的关联映射:

*主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联。如下图:

Hibernate投射解析——七种映射关系

例子:单向一对一主键关联例子连接

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

Hibernate投射解析——七种映射关系

例子:单向一对一唯一外键关联例子连接

注意:因为一对一的主键关联映射扩展性不好,当我们的需要发生改变想要将其变为一对多的时候变无法操作了,所以我们遇到一对一关联的时候经常会采用唯一外键关联来解决问题,而很少使用一对一主键关联。

2、 单向多对一关联映射(many-to-one):

多对一关联映射原理:在多的一端加入一个外键,指向一的一端,如下图:

Hibernate投射解析——七种映射关系

关键映射代码——在多的一端加入如下标签映射:


注意:它与多对一的区别是维护的关系不同

*多对一维护的关系是:多指向一的关系,有了此关系,加载多的时候可以将一加载上来

*一对多维护的关系是:一指向多的关系,有了此关系,在加载一的时候可以将多加载上来

关键映射代码——在一的一端加入如下标签映射:


关键映射代码——可以在User的一端加入如下标签映射:

   

双向一对一主键映射关键映射代码——在IdCard端新加入如下标签映射:

              <set name="roles" table="t_user_role">                    <key column="user_id"/>                    <many-to-many class="com. hibernate.Role" column="role_id"/>             </set>

总结:对于上面这七种关联映射中,最重要的就是一对多的映射,因为它更贴近我们的现实生活,比如:教室和学生就可以是典型的一对多的关系,而我们开发软件的目的之一就是为了解决一些生活中重复性问题,把那些重复的问题交给计算机帮助我们完成,从而来提高我们的工作效率。一句话:生活离开不开编程,编程更离不开生活。

16楼yy_2011前天 19:40
犀利咯,复习下,谢谢
Re: smszhuang168昨天 17:29
回复yy_2011n[e10]
15楼C_yongpeng前天 19:31
不错 值得学习 很好!
Re: smszhuang168前天 19:32
回复C_yongpengn谢谢留言
14楼xuhesheng前天 17:15
不错,学习了n帮顶一下
Re: smszhuang168前天 19:12
回复xuheshengn谢谢哦
13楼wanghuan203前天 12:01
不错呀!
12楼avantnt前天 09:43
单向一对多关联映射(one-to-many) 这个 不是由1这一方来管理吗?在一方设置个set..记错了?忘记了。学习一下
Re: avantnt前天 10:10
回复avantntn嗯。。毕竟在项目中..大多数都是多对一
Re: smszhuang168前天 11:08
回复avantntn你说的是对的,是由一的一方来维护的,所以它是存在缺陷的,经常会用双向映射来解决这个问题
11楼happy09li前天 23:42
图文并茂,很清晰
Re: smszhuang168前天 08:21
回复happy09lin[e10]
10楼han_yankun2009前天 22:54
学习了
Re: smszhuang168前天 23:30
回复han_yankun2009n共同学习
9楼zx1030前天 20:50
学习啦
8楼asdfzhai前天 20:49
7楼qjqqqqir3天前 18:02
[e01]
6楼liutengteng1303天前 16:16
支持师哥。[e01]
Re: smszhuang1683天前 16:27
回复liutengteng130n谢谢
5楼lsh66883天前 15:52
犀利啊
Re: smszhuang1683天前 16:10
回复lsh6688n[e04]
4楼qq7994993433天前 15:51
额,总结的很好啊!不过,那个多对多好像简略了点、、、
Re: smszhuang1683天前 15:52
回复qq799499343n嗯,只写了和其他的比较有变化的地方
3楼StubbornPotatoes3天前 15:36
首页了。
Re: smszhuang1683天前 15:51
回复StubbornPotatoesn大姑娘上轿,头一回呀
2楼Ywasd3天前 09:31
又复习了一次!
1楼llhhyy19893天前 07:56
再次学习hibernate中基础的映射关系
Re: smszhuang1683天前 08:03
回复llhhyy1989n温故而知新

读书人网 >其他数据库

热点推荐