一对多关联映射和多对一的关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端。关联关系都是由多端维护,只是在写映射时发生了变化。html
多对一和一对多的区别在于维护的关系不一样:java
(1)多对一:多端维护一端的关系,在加载多端时,能够将一端加载上来。app
(2)一对多:一端维护多端的关系,在加载一端时,能够将多端加载上来。测试
对象模型this
从对象模型中,咱们能够看出,Group持有User的一个引用。因为是单向关联,因此数据在加载Group时,会把User加载上来,可是User并不知道Group的存在。spa
咱们先看一下Group和User的实体,以及映射文件。.net
Grouphibernate
[java] view plain copyxml
Userhtm
[java] view plain copy
User.hbm.xml
[html] view plain copy
Group.hbm.xml
[html] view plain copy
生成的表结构和测试数据
1)由于多端User不知道Group的存在(也就是User不维护与Group的关系),因此在保存User时,关系字段groupId为null,若是该字段设置为非空,则将没法保存数据。
2)由于User不维护关系,而Group维护关系,Group就会发出多余的update语句,保证Group和User有关系,这样加载Group时才把该Users对应的用户加载上来。
对象模型
双向关联映射对比单向关联映射,对象的加载方向由单向变成了双向。
咱们看一下Group和User的实体,映射文件
Group
[java] view plain copy
User
[java] view plain copy
Group.hbm.xml
[html] view plain copy
User.hbm.xml
[html] view plain copy
生成的表和测试数据
一对多双向关联的映射方式:
1)在一的一端的集合上采用<key>标签,在多的一端加入一个外键
2)在多的一端采用<many-to-one>标签
注意:<key>标签和<many-to-one>标签加入的字段保持一直,不然会产生数据混乱。
inverse属性:
inverse属性能够用在一对多和多对多双向关联上,inverse属性默认为false,为false表示本端维护关系,若是inverse为true,则本端不能维护关系,会交给另外一端维护关系,本端失效。因此一对多关联映射咱们一般在多的一端维护关系,让一的一端失效,因此设置为inverse为true。
注意:inverse属性,只影响数据的存储,也就是持久化。
一对多双向关联映射的目的主要是为了解决一对多单向关联的缺陷而不是需求驱动的。
一对多关联映射仍是很简单的,下篇博文咱们介绍多对多关联映射。谢谢关注。