一对多关联映射

映射原理

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

多对一和一对多的区别

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

(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. 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 Set getUsers() {
  20. return users;
  21. }
  22. public void setUsers(Set users) {
  23. this.users = users;
  24. }
  25. }

User

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

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. import java.util.Set;
  3. public class Group {
  4. private int id;
  5. private String name;
  6. private Set users;
  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 Set getUsers() {
  20. return users;
  21. }
  22. public void setUsers(Set users) {
  23. this.users = users;
  24. }
  25. }

User

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

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表示本端维护关系,如果inverse为true,则本端不能维护关系,会交给另一端维护关系,本端失效。所以一对多关联映射我们通常在多的一端维护关系,让一的一端失效,所以设置为inverse为true。

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

目的

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

总结

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

转:http://blog.csdn.net/jiuqiyuliang/article/details/41015641

(Hibernate进阶)Hibernate映射——一对多关联映射(七)的更多相关文章

  1. 【SSH进阶之路】Hibernate映射——一对多关联映射(七)

    上上篇博文[SSH进阶之路]Hibernate映射——一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份 ...

  2. 【SSH系列】Hibernate映射 -- 一对多关联映射

        映射原理       一对多关联映射和多对一关联映射的映射原理是一样一样的,所以说嘛,知识都是相通的,一通百通,为什么说一对多关联映射和多对一关联映射是一样的呢?因为她们都是在多的一端加入一个 ...

  3. java之hibernate之单向的一对多关联映射

    这篇主要讲hiberante中的 单向一对多关联映射 1.在应用中,有时候需要从一的一端获取多的一端的数据.比如:查看某个分类下的所有书籍信息:查看某个订单下的所有商品等. 2.在一对多的关联关系中, ...

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

    上篇博文[SSH进阶之路]Hibernate映射——一对多关联映射(七),我们介绍了一对多关联映射,它是多对多关联映射的基础. 多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接 ...

  5. hihernate一对多关联映射

    hihernate一对多关联映射 一对多关联映射利用了多对一关联映射原理 多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一 一对多关联映射:在多的一端加入一个外键指向一的一端 ...

  6. (Hibernate进阶)Hibernate映射——多对多关联映射(八)

    多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接开始. 映射原理 不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联.用第三张表来解决可能会造成数 ...

  7. 【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)

    上篇博文[SSH进阶之路]Hibernate映射--一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指仅仅能从人(Person)这端载入身份证端(IdCard),可是反过来.不能从身份 ...

  8. 【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)

    [SSH进阶之路]Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,採用对象化的思维操作关系型数据库. [SSH进阶之路]Hibernate搭建开发环境+简单实例 ...

  9. hibernate一对多关联映射

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

随机推荐

  1. 灰色蓝色系简洁自适应登录HTML页面

    自己写了一个简介的登录页面,页面背景为灰色,居中为登录框,登录面板为半透明效果,整体十分美观,登录按钮有JS效果.自己感觉还不错,拿出来分享一下. 页面效果图 源码下载链接:http://files. ...

  2. wince5代码整理

    BAT文件语法: @REM 这是注释标识与REM的区别就是在echo on时REM的注释也会显示出来 @REM 设置变量BSP_SMDK2416为2 set BSP_SMDK2416=2 @REM 设 ...

  3. PetaPoco 批量插入数据

    网上找的代码,还没经过验证 /// <summary> /// Bulk inserts multiple rows to SQL /// </summary> /// < ...

  4. JavaScript 消息框+特殊字符

    JavaScript 中创建三种消息框:警告框.确认框.提示框: 1.警告框: 警告框经常用于确保用户可以得到某些信息. 当警告框出现后,用户需要点击确定按钮才能继续进行操作 语法:alert(&qu ...

  5. MongoDB安装及添加到Windows服务,随系统启动

    本文介绍在Windows环境下安装MongoDB及添加到Windows服务中,随系统启动 首先去官网下载Windows安装包:https://www.mongodb.org/downloads 一般情 ...

  6. C#压缩图片——高质量压缩方式

    传入Bitmap对象,以及新图片的长宽(Bitmap.Size),这样生成的就是跟原图尺寸一致的低质量图片 public Bitmap GetImageThumb(Bitmap mg, Size ne ...

  7. Python核心编程练习题笔记: type(a)==type(b) 和 type(a) is type(b)的差别

    前式需要找到类型的ID(相当于门牌号),然后“敲门”取得类型值 后式只需要找到类型的ID,而不需要再去“敲门”获得类型具体值.在一个“门牌号”内只可能有一个值,因此就不用明知故问了.因此后式比前式少了 ...

  8. 使用SPM创建新组件

    (前提:已经安装好了spm) 步骤如下:

  9. dvwa第一次接触

    DVWA (Damn Vulnerable Web Application)DVWA是用PHP+Mysql编写的一套用于常规WEB漏洞教学和检测的WEB脆弱性测试程序.包含了SQL注入.XSS.盲注等 ...

  10. angular2开发01

    // */ // ]]> angular2开发01 1. angular2 开发准备 1.1. 安装node 1.2. 安装npm 1.3. 运行qickStart 1 angular2 开发准 ...