Hibernate映射——一对多关联映射(七)

转载 2015年11月17日 20:52:41

一对多关联映射

 

映射原理

 

      一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端。关联关系都是由多端维护,只是在写映射时发生了变化。

 

多对一和一对多的区别

 

         多对一和一对多的区别在于维护的关系不同

(1)多对一:多端维护一端的关系,在加载多端时,可以将一端加载上来。

(2)一对多:一端维护多端的关系,在加载一端时,可以将多端加载上来。

 

分类

 

一对多单向关联映射

 

对象模型

          

      从对象模型中,我们可以看出,Group持有User的一个引用。由于是单向关联,所以数据在加载Group时,会把User加载上来,但是User并不知道Group的存在。

 

      我们先看一下Group和User的实体,以及映射文件。

Group

  1. package com.liang.hibernate;  
  2. import java.util.Set;  
  3. public class Group {  
  4.     private int id;  
  5.     private String name;  
  6.     private Set users;  
  7.       
  8.     public int getId() {  
  9.         return id;  
  10.     }  
  11.     public void setId(int id) {  
  12.         this.id = id;  
  13.     }  
  14.     public String getName() {  
  15.         return name;  
  16.     }  
  17.     public void setName(String name) {  
  18.         this.name = name;  
  19.     }  
  20.     public Set getUsers() {  
  21.         return users;  
  22.     }  
  23.     public void setUsers(Set users) {  
  24.         this.users = users;  
  25.     }  
  26. }  

User

  1. package com.liang.hibernate;  
  2.   
  3. public class User {  
  4.     private int id;  
  5.     private String name;  
  6.   
  7.     public int getId() {  
  8.         return id;  
  9.     }  
  10.     public void setId(int id) {  
  11.         this.id = id;  
  12.     }  
  13.     public String getName() {  
  14.         return name;  
  15.     }  
  16.     public void setName(String name) {  
  17.         this.name = name;  
  18.     }  
  19. }  

User.hbm.xml

  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping>  
  6.     <class name="com.liang.hibernate.User" table="t_user">  
  7.         <id name="id">  
  8.             <generator class="native"/>  
  9.         </id>  
  10.         <property name="name"/>  
  11.     </class>  
  12. </hibernate-mapping>  

Group.hbm.xml

  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping>  
  6.     <class name="com.liang.hibernate.Group" table="t_group">  
  7.         <id name="id">  
  8.             <generator class="native"/>  
  9.         </id>  
  10.         <property name="name"/>  
  11.         <!-- users属性,表达的是本对象与User的一对多的关系 -->  
  12.         <set name="users">  
  13.              <!--当前表(Group)的主键-->  
  14.             <key column="groupid"/>  
  15.             <one-to-many class="com.liang.hibernate.User"/>  
  16.         </set>  
  17.     </class>  
  18. </hibernate-mapping>  

生成的表结构和测试数据

缺点

 

1)因为多端User不知道Group的存在(也就是User不维护与Group的关系),所以在保存User时,关系字段groupId为null,如果该字段设置为非空,则将无法保存数据。

2)因为User不维护关系,而Group维护关系,Group就会发出多余的update语句,保证Group和User有关系,这样加载Group时才把该Users对应的用户加载上来。

 

一对多双向关联映射

 

对象模型

           

        双向关联映射对比单向关联映射,对象的加载方向由单向变成了双向。

 

我们看一下Group和User的实体,映射文件

Group

  1. package com.liang.hibernate;  
  2.   
  3. import java.util.Set;  
  4.   
  5. public class Group {  
  6.     private int id;  
  7.     private String name;  
  8.     private Set users;  
  9.   
  10.     public int getId() {  
  11.         return id;  
  12.     }  
  13.     public void setId(int id) {  
  14.         this.id = id;  
  15.     }  
  16.     public String getName() {  
  17.         return name;  
  18.     }  
  19.     public void setName(String name) {  
  20.         this.name = name;  
  21.     }  
  22.     public Set getUsers() {  
  23.         return users;  
  24.     }  
  25.     public void setUsers(Set users) {  
  26.         this.users = users;  
  27.     }  
  28. }  

User

  1. package com.liang.hibernate;  
  2.   
  3. public class User {  
  4.     private int id;  
  5.     private String name;  
  6.     private Group groups;  
  7.     public int getId() {  
  8.         return id;  
  9.     }  
  10.     public void setId(int id) {  
  11.         this.id = id;  
  12.     }  
  13.     public String getName() {  
  14.         return name;  
  15.     }  
  16.     public void setName(String name) {  
  17.         this.name = name;  
  18.     }  
  19.     public Group getGroups() {  
  20.         return groups;  
  21.     }  
  22.     public void setGroups(Group groups) {  
  23.         this.groups = groups;  
  24.     }  
  25. }  

Group.hbm.xml

  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="com.liang.hibernate">  
  6.     <class name="Group" table="t_group">  
  7.         <id name="id">  
  8.             <generator class="native"/>  
  9.         </id>  
  10.         <property name="name"/>  
  11.         <!-- 影响控制反转:inverse="false",多的一端维护关系,让一的一端失效 -->  
  12.         <set name="users" inverse="true">  
  13.             <key column="groupid" not-null="true"/>  
  14.             <one-to-many class="User"/>  
  15.         </set>  
  16.     </class>  
  17. </hibernate-mapping>  

User.hbm.xml

  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="com.liang.hibernate">  
  6.     <class name="User" table="t_user">  
  7.         <id name="id">  
  8.             <generator class="native"/>  
  9.         </id>  
  10.         <property name="name"/>  
  11.         <!-- groups属性,表达的是本对象与Group的多对一的关系 -->  
  12.         <many-to-one name="groups" class="Group" column="groupid"/>  
  13.     </class>  
  14. </hibernate-mapping>  

生成的表和测试数据

 

一对多双向关联的映射方式:
 1)在一的一端的集合上采用<key>标签,在多的一端加入一个外键
 2)在多的一端采用<many-to-one>标签

注意:<key>标签和<many-to-one>标签加入的字段保持一直,否则会产生数据混乱。

inverse属性:

         inverse属性可以用在一对多和多对多双向关联上,inverse属性默认为false,为false表示本端维护关系,如果inversetrue,则本端不能维护关系,会交给另一端维护关系,本端失效。所以一对多关联映射我们通常在多的一端维护关系,让一的一端失效,所以设置为inversetrue。

注意:inverse属性,只影响数据的存储,也就是持久化。

 

目的

 

       一对多双向关联映射的目的主要是为了解决一对多单向关联的缺陷而不是需求驱动的。

 

总结

 

     一对多关联映射还是很简单的,下篇博文我们介绍多对多关联映射。谢谢关注。

Hibernate关联映射——一对多(多对一)

Hibernate关联映射——一对多(多对一)我们以客户(Customer)与订单(Order)为例来讲解Hibernate关联映射中的一对多关联关系。 首先肯定是搭建好Hibernate的开发环境...
  • yerenyuan_pku
  • yerenyuan_pku
  • 2017年04月13日 02:36
  • 1283

hibernate一对多关联映射——双向(非常常用)

原文地址:http://blog.sina.com.cn/s/blog_5fad23090100fct8.html 一对多关联映射通常设为双向的,关系字段设置在一的一端,而且在多的一端维护, 一、...
  • springsen
  • springsen
  • 2012年08月08日 16:32
  • 3540

【SSH进阶之路】Hibernate映射——多对多关联映射(八)

多对多映射是现实生活中最常见的映射,也是最容易理解的映射。废话少说,直接开始。   映射原理        不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联。用第三张表...
  • jiuqiyuliang
  • jiuqiyuliang
  • 2014年11月22日 08:14
  • 15024

【SSH进阶之路】Hibernate映射——多对一单向关联映射(四)

基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一个或多个引用。...
  • jiuqiyuliang
  • jiuqiyuliang
  • 2014年10月22日 08:15
  • 31407

SSH框架之Hibernate的关联映射之一对多、多对一映射

关联映射之一对多、多对一映射 一、需求: 部门与员工 一个部门有多个员工 【一对多】 多个员工,属于一个部门 【多对一】 二、逻辑分析: 三、代码实现 1、javabean及映射文件的配...
  • qq_34944851
  • qq_34944851
  • 2016年12月19日 11:37
  • 1966

Hibernate(六)实现一对多、多对一映射关联关系

一对多、多对一这种关系在现实生活中很多,例如部门与员工的关系,学校里班级与学生的关系... 那么在具体的系统实现中如果i实现这种关联关系呢?这里以部门和员工的关系为例。 部门实体类 package t...
  • u011731233
  • u011731233
  • 2015年07月16日 09:12
  • 3508

【Hibernate步步为营】--多对多映射详解

上篇文章详细讨论了一对多映射,在一对多映射中单向的关联映射会有很多问题,所以不建议使用如果非要采用一对多的映射的话可以考虑使用双向关联来优化之间的关系,一对多的映射其实质上是在一的一端使用标签来标明它...
  • zhang_xinxiu
  • zhang_xinxiu
  • 2014年05月27日 10:10
  • 4617

【Hibernate步步为营】--(一对多映射)之双向关联

单向关联的一对多映射,在一的一端维护双向的关系这种做法虽然能实现但是存在很多缺陷,首先生成很多多余的SQL语句,因为多的一端不维护关系,只有一的一端维护,在进行操作时一的一端会发出多余的update语...
  • zhang_xinxiu
  • zhang_xinxiu
  • 2014年05月25日 14:26
  • 4331

hibernate5(11)注解映射[3]一对多多对一双向关联

在上两篇文章里,我们详细地分别讲解了一对多和多对一的单向关联配置的具体属性含义,在这一篇文章里,我们完成两者的的整合建立双向关联。 在实际的博客网站中,我们可能需要根据文章读取作者(用户)信息,但肯...
  • qwe6112071
  • qwe6112071
  • 2016年04月08日 08:51
  • 3808

一步步学习Hibernate框架(三):采用jpa实现一对多关联映射(一)

JPA(Java Persistence API)是Sun官方提出的一种Java持久化规范。为Java开发人员提供了一种对象/关系映射工具,管理Java应用中的关系数据。JPA的总体思想和现有Hibe...
  • dandanzmc
  • dandanzmc
  • 2015年02月28日 15:52
  • 3588
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hibernate映射——一对多关联映射(七)
举报原因:
原因补充:

(最多只允许输入30个字)