继上篇博客

一对多关联映射(单向)

上面我们介绍了多对一,我们反过来看一对多不就是多对一吗?那还用再进行不同的映射吗?有什么区别吗?一对多和多对一映射原理是一致的,存储是同样的。也就是生成的数据库的表是一样的。他们之间不同的是维护的关系不同。

他们之间不同点是维护的关系不同

*多对一维护的关系是:多指向一的关系。有了此关系,载入多的时候能够将一载入上来。

*一对多维护的关系是:一指向多的关系。有了此关系,在载入一的时候能够将多载入上来。

一个班级有多个学生,通过班级能够看到学生信息。

Classes的映射关系

<hibernate-mapping>
<class name="com.bjpowernode.hibernate.Classes">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<set name="students">
<key column="classesid"/>
<one-to-many class="com.bjpowernode.hibernate.Student"/>
</set>
</class>
</hibernate-mapping>

Student的映射关系

<hibernate-mapping>
<class name="com.bjpowernode.hibernate.Student">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
</class> </hibernate-mapping>

再看保存的代码:给班级设置学生,而由于学生维护关系。就要在学生端保存班级id--会带来什么问题?

public void testSave2(){
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction(); Student student1=new Student();
student1.setName("张三");
session.save(student1); Student student2=new Student();
student2.setName("李四");
//保存学生
session.save(student2); Classes classes=new Classes();
classes.setName("动力节点"); Set students=new HashSet();
students.add(student1);
students.add(student2); classes.setStudents(students);
session.save(classes);
session.getTransaction().commit(); }catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}

在保存数据时,会存在这么一个时刻:so?带来的问题

1,从班级能看到学生。是班级来维护关系,不是学生来维护关系,学生不知道自己是哪个班。所以在保存学生的时候,班级id不知道。为了更新学生是哪个班级的要发出非常多update语句来告诉学生是哪个班级的。

2。当我们设置classesidnot-null=“true”时,则将无法保存数据,解决的方法我们改为双向关联映射。

一对多关联映射(双向)

为了解决一对多单向可能存在的问题,我们採用双向一对多。每一方都能维护对方。

而不是需求驱动

一对多双向关联映射方式:

*在一的一端的集合上採用<key>标签。在多的一端增加一个外键。

*在多的一端採用<many-to-one>的标签

!~注意<key>标签和<many-to-one>标签增加字段保持一致,否则会产生数据混乱。

Classes映射文件

<hibernate-mapping>
<class name="com.bjpowernode.hibernate.Classes">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<set name="students" inverse="true">
<key column="classesid"/>
<one-to-many class="com.bjpowernode.hibernate.Student"/>
</set>
</class>
</hibernate-mapping>

Student映射文件

<hibernate-mapping>
<class name="com.bjpowernode.hibernate.Student">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<many-to-one name="classes" column="classesid"></many-to-one>
</class>
</hibernate-mapping>

注意:Inverse属性

1、Inverse中文意思为相反的,反转。在hibernate中inverse能够用在一对多和多对多双向关联上,inverse默认是false。为false的时候表示本端能够维护关系,假设inverse为true,则本端不能维护关系。会交给还有一端维护关系。本端失效,所以在一对多关联映射我们通常在多的一端维护关系。让一的一端失效。

2、Inverse是控制方向上的反转,仅仅影响存储。

比較一对多单向和双向映射,从存储结构上看没有什么差别,可是从配置文件上看。一对多双向关联的配置文件里在多的一端的配置文件上存在<many-to-one>相关配置,即保证多对一的映射。

下篇继续。

【SSH 基础】浅谈Hibernate关系映射(3)的更多相关文章

  1. 【SSH 基础】浅谈Hibernate关系映射(4)

    继上篇博客 多对多关联映射(单向) 多对多对象关系映射,须要增加一张新表完毕基本映射. Hibernate会自己主动生成中间表 Hibernate使用many-to-many标签来表示多对多的关联,多 ...

  2. Hibernate学习笔记-Hibernate关系映射

    1. 初识Hibernate——关系映射 http://blog.csdn.net/laner0515/article/details/12905711 2. Hibernate 笔记8 关系映射1( ...

  3. Hibernate基础学习(五)—对象-关系映射(下)

    一.单向n-1 单向n-1关联只需从n的一端可以访问1的一端. 域模型: 从Order到Customer的多对一单向关联.Order类中定义一个Customer属性,而在Customer类不用存放Or ...

  4. Hibernate基础学习(四)—对象-关系映射(上)

    一.映射对象标识符      Java语言按内存地址来识别或区分同一个类的不同对象,而关系数据库按主键值来识别或区分同一个表的不同记录.Hibernate使用对象标识符(OID)来建立内存中的对象和数 ...

  5. 浅谈Hibernate入门

    前言 最近打算做一个自己的个人网站,经过仔细思考,打算使用hibernate作为开发的ORM框架,因此各种找资料,由于本人是刚刚接触这技术的,所以就找了比较基础的知识来分享下 基本概述 Hiberna ...

  6. C#核心基础--浅谈类和对象的概念

    浅谈类和对象的概念 一.什么是类?什么是对象? 学习一门面向对象编程语言,我们必须得知道什么是类?什么是对象? 类(Class)实际上是对某种类型的对象定义变量和方法的原型.它表示对现实生活中一类具有 ...

  7. 浅谈hibernate的sessionFactory和session

    一.hibernate是什么? Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hiber ...

  8. 浅谈hibernate+入门实例

    Hibernate是对jdbc进一步的封装,随着项目的开展,小编开始接触到这个概念,一开始接触的时候并没有觉得hibernate有多神秘,没有进一步的研究,只是简单的知道她是对jdbc的进一步的封装, ...

  9. web进修之—Hibernate 关系映射(3)

    概述 Hibernate的关系映射是Hibernate使用的难点或者是重点(别担心,不考试哦~),按照不同的分类方式可以对这些映射关系做一个分类,如: 按对象对应关系分: 一对一 多对一/一对多 多对 ...

随机推荐

  1. Android源代码解析之(七)--&gt;LruCache缓存类

    转载请标明出处:一片枫叶的专栏 android开发过程中常常会用到缓存.如今主流的app中图片等资源的缓存策略通常是分两级.一个是内存级别的缓存,一个是磁盘级别的缓存. 作为android系统的维护者 ...

  2. 安全风控的CAP原理和BASE思想

    CAP原理最多实现两个,需要牺牲一个来满足其他两个:

  3. 从头认识java-15.3 使用HashSet须要注意的地方

    这一章节我们来讨论一下使用Set的各种实现须要注意的地方. Set接口的经常使用实现类有:HashSet.TreeSet,LinkedHashSet 1.HashSet 大家对于HashSet的印象都 ...

  4. UVA 11077 Find the Permutations 递推置换

                               Find the Permutations Sorting is one of the most used operations in real ...

  5. JAVA设计模式之【策略模式】

    策略模式 定义一些独立的类来封装不同的算法 类似于common方法或者引用类 角色 环境类Context 抽象策略Strategy 具体策略ConcreteStrategy 重构伴随着设计模式 重构类 ...

  6. 前后端分离跨域 关于前后端分离开发环境下的跨域访问问题(angular proxy=>nginx )

    前后端分离后遇到了跨域访问的问题: angular1中使用proxy很麻烦,最后还是失败结束:最后总结3种方法如下: 本人使用的第一种方法,只是开发环境下使用很方便! 1:禁掉谷歌的安全策略(Turn ...

  7. 92.bower 需要git

    转自:https://blog.csdn.net/chenleismr/article/details/50458496Bower 是基于 Git 之上的包管理工具,它提供的包其源头都是一个 Git ...

  8. vim编辑器常用语法

    1)yy (功能描述:复制光标当前一行) y数字y (功能描述:复制一段(从第几行到第几行))2)p (功能描述:箭头移动到目的行粘贴)3)u (功能描述:撤销上一步)4)dd (功能描述:删除光标当 ...

  9. highcharts的使用:从数据库获取数据显示在图上

    //月产量统计图 function GetHighCharts() { var date = new Date(); var year = date.getFullYear(); var month_ ...

  10. 前端模块化 | 解读JS模块化开发中的 require、import 和 export

    本篇分为两个部分 第一部分:总结了ES6出现之前,在当时现有的运行环境中,实现"模块"的方式: 第二部分:总结了ES6出现后,module成为ES6标准,客户端实现模块化的解决方案 ...