继上篇博客

一对多关联映射(单向)

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

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

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

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

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

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. web前端-移动端响应式与自适应

    一. 在HTML的头部加入meta标签 在HTML的头部,也就是head标签中增加meta标签,告诉浏览器网页宽度等于设备屏幕宽度,且不进行缩放,代码如下: <meta name="v ...

  2. poi操作excel2007(读取、生成、编辑)

    因为现在再写excel2003版的比较low,所以我在这就不介绍了,直接介绍2007,我所用的编程软件是IDEA poi操作office总共有6个jar包,在pom.xml文件中配置如下,也可下载后直 ...

  3. Hadoop学习;測试;启动bug;secondary合并edits到fsimage

    一个Hadoop集群拥有多个并行的计算机.用以存储和处理大规模的数据集 Hadoop强调代码向数据迁移 要执行的程序在规模上比数据小的多,更easy移动,此外通过网络移动数据比载入执行程序更花时间,这 ...

  4. csdn第五届在线编程大赛-全然平方

    题目详情 给定整数区间[A,B]问当中有多少个全然平方数. 输入格式: 多组数据,包括两个正整数A,B 1<=A<=B<=2000000000. 输出格式: 每组数据输出一行包括一个 ...

  5. [IOS]mac远程window全屏显示

    在mac自带着一个远程window的软件.这让我们远程起来很方便. 其步骤和window远程也很相似. 输入ip地址: 输入username以及password: 然后点击确定就可以. 只是.这时就出 ...

  6. Android之怎样改变焦点状态【EditText】

    以EditText为例 1.改变焦点状态 password.setOnFocusChangeListener(new OnFocusChangeListener() { @Override publi ...

  7. 关于iOS7中UIView效果失效问题的解决

    最近想做一个跑马灯的效果.于是写出了例如以下的跑马灯效果的代码...可是调试发现,在iOS6下动画是能够运行的,可是在iOS7下动画并不运行,没有达到预期的效果. [_scrollLabel size ...

  8. Android 广播大全 Intent Action 事件详解

    Android 广播大全 Intent Action 事件详解 投稿:mrr 字体:[增加 减小] 类型:转载 时间:2015-10-20我要评论 这篇文章主要给大家介绍Android 广播大全 In ...

  9. 【算法】Floyd-Warshall算法(任意两点间的最短路问题)(判断负圈)

    求解所有两点间的最短路问题叫做任意两点间的最短路问题. 可以用动态规划来解决, d[k][i][j] 表示只用前k个顶点和顶点i到顶点j的最短路径长度. 分两种情况讨论: 1.经过顶点k,  d[k] ...

  10. SpringCloud学习笔记(6)----Spring Cloud Netflix之负载均衡-Ribbon的使用

    1. 什么是负责均衡? 负载均衡,就是分发请求流量到不同的服务器. 负载均衡一般分为两种 1. 服务器端负载均衡(nginx) 2. 客户端负载均衡(Ribbon) 2. 服务提供者(spring-c ...