上篇学习了Hibernate的基本映射,也就是单表映射,非常easy就能理解,可是对于关系数据库来说,表之间存在关系是比不可少的。关系数据库中存在的关系是通过主外键建立起来的。反应到Hibernate要怎样通过对象表现呢?以下我们就继续学习Hibernate的对象关系映射。

  我们先从最常见的多对一和一对多关系開始:

多对一

  所谓多对一,在数据库中即在多的一端加入外键关联到一的一端,比方用户(User)和用户所在组(Group)的关系:一个User仅仅属于一个Group,一个Group有多个Group。而且能够通过User获取所在的Group。

通过以下的类图和表关系来看Hibernate的映射实现:

1、首先是实体类User和Group

	package tgb.hibernate;

	/*
* 用户组
*/
public class Group { private int id;
private String name; public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
} public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package tgb.hibernate; /**
* 用户
* @author Jones
*
*/
public class User { private int id;
private String name; //关联用户组属性(在用户实体中加入用户组。表明通过用户能够看到所在组)
private Group group; public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
} public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
}

我们在多的一端(User)加入Group的属性引用,这样能够通过User对象得到Group对象。

2、映射文件配置

用户组Group.hbm.xml

	<hibernate-mapping>
<class name="tgb.hibernate.Group" table="t_group">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>

用户User.hbm.xml

	<hibernate-mapping>
<class name="tgb.hibernate.User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="group" column="groupid" cascade="save-update"/>
</class>
</hibernate-mapping>

通过配置文件我们看到。多对一关系映射的实现是:

在多的一端(User)採用例如以下标签映射:

<many-to-onename="group" column="groupid"/>

  映射成功后。兴许就是对对象的操作(增删改查-持久化到数据库),用了以上映射,我们能够通过Hibernate的级联操作对实体进行快捷操作。可是这样还不够。这里就来看级联操作的问题。比如我们须要加入用户组和组下的用户:

级联问题:

session = HibernateUtils.getSession();
session.beginTransaction(); Group group = new Group();
group.setName("系统管理员"); User user1 = new User();
user1.setName("张三");
user1.setGroup(group); User user2 = new User();
user2.setName("李四");
user2.setGroup(group); session.save(user1);
session.save(user2); //在清理缓存是错误发生TransientObjectException
//由于Group为Transient状态。没有被session,在数据库中没有匹配的数据
//而User为Persistent状态。在清理缓存时hibernate在缓存中无法找到Group对象
//结论:Persistent状态的对象不能引用Transient状态的对象
session.getTransaction().commit();

  正如凝视所说会发生TransientObjectException错误,在保存对象(user)过程中,该对象有一个属性(外键)关联的另外一个未持久化的对象(未保存的对象group),解决方法是先保存"被关联"的那个对象,才干保存先前的那个对象,当然我们这样能够实现我们的须要,可是Hibernate提供了更快捷的方式。以下看Hibernate的级联操作和配置。

级联操作

  级联是对象之间的连锁操作,它仅仅影响加入、删除和改动。Hibernate对级联的控制是在配置文件的关系标签中通过cascade进行配置。

还以加入用户组和用户为例,我们须要对<many-to-one>中加入:

<many-to-one name="group" column="groupid" cascade="save-update"/>

“cascade”就来说明在操作两个或多个关联对象,当对当中一个对象进行某种操作时,是否对其关联的对象也作类似的操作。比方我们保存用户是是否也同一时候保存其所在组。

级联(Cascade)还有例如以下经常使用属性:

    (1)none:在保存。删除或改动当前对象时,不正确其附属对象(关联对象)进行级联操作。它是默认值。

    (2)save-update:在保存,更新当前对象时,级联保存,更新附属对象(暂时对象,游离对象)。

    (3)delete:在删除当前对象时,级联删除附属对象。

    (4)all:全部情况下均进行级联操作。即包括save-update和delete等等操作。

    (5)delete-orphan:删除此对象的同一时候删除与当前对象解除关系的孤儿对象(只使用于一对多关联关系中)。

    这些我们能够依据详细的业务进行设置。

总结

   Hibernate中的关系映射反应的就是类之间的关系,关系数据库中就是主外键关系。数据库和UML我们都非常熟了,映射也就没有问题,当然关系映射在Hibernate是最基础的内容了。项目实践是不可缺少了。下文继续Hibernate的一对多映射(包含双向映射)。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

Hibernate制图(两)——许多-于─关系映射的更多相关文章

  1. [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  2. Hibernate -- 注解(Annotation)关系映射

    转自:http://www.cnblogs.com/tyler2000/archive/2011/01/20/1940354.html 1. Hibernate Annotation关系映射有下面几种 ...

  3. Hibernate(三)——框架中的关系映射

    在设计数据库时我们会考虑,表与表之间的关系,例如我们前边经常提到的一对一,一对多,多对多关系,在数据库中我们通过外键,第三张表等来实现这些关系.而Hibernate时间实体类和数据库中的表进行的映射, ...

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

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

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

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

  6. hibernate实体xml一对多关系映射

    单向一对多关系映射: 一个房间对应多个使用者,也就是Room實例知道User實例的存在,而User實例則沒有意識到Room實例. 用户表: package onlyfun.caterpillar; p ...

  7. hibernate学习(5)——多对多关系映射

    1.创建实体和映射 package com.alice.hibernate03.vo; import java.util.HashSet; import java.util.Set; public c ...

  8. Java之旅hibernate(8)——基本关系映射

    何为关系,何为映射,关系这个词想必大家都不陌生.比方你和老师之间是师生关系,你和父母之间是父子或者父女(母子或者母女关系). 关系是存在某种联系物体之间产生的.什么都是可能的.比方你和工具,你仅仅能使 ...

  9. hibernate学习(设计一对一 关系 映射)

    //主表 package org.crazy.app.domain; import javax.persistence.*; @Entity @Table(name="person_inf& ...

  10. Hibernate_day03讲义_使用Hibernate完成多对多的关系映射并操作

随机推荐

  1. 伪异步IO理解

    伪异步IO实在堵塞IO的基础上将每个client发送过来的请求由新创建的线程来处理改进为用线程池来处理.因此避免了为每个client请求创建一个新线程造成的资源耗尽问题. 来看一下伪异步IO的服务端代 ...

  2. ListView 实现多选/无线电

    ListView本身与无线电.多选模式.由listview.setChoiceMode设置: listview.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE) ...

  3. HDU 4067 Random Maze

    意甲冠军: 一个"随机图"它被定义为具有以下性质如: 一个入口和一个出口 有向图 对于入口  出度比入度大1 对于出口  入度比出度大1 对于其它点  入度等于出度 现给出一幅有向 ...

  4. Codeforces 451E Devu and Flowers(容斥原理)

    题目链接:Codeforces 451E Devu and Flowers 题目大意:有n个花坛.要选s支花,每一个花坛有f[i]支花.同一个花坛的花颜色同样,不同花坛的花颜色不同,问说能够有多少种组 ...

  5. 使用autoconf和automake生成Makefile文件(转)

    Makefile好难写 曾经也总结了一篇关于Makefile的文章<make和makefile的简单学习>.但是,总结完以后,发现写Makefile真的是一件非常痛苦的事情,的确非常痛苦. ...

  6. W5500EVB TCP Client模式设置说明

    W5500EVB是WIZnet为了方便用户更好了解.使用W5500这款网络芯片所开发的评估板,该板採用了 STM32F103RCT6+W5500 的设计.基于 ARM 的 Cortex-M3 平台.那 ...

  7. GoldenGate组态(四)它veridata组态

    GoldenGate组态(四)它veridata组态 环境: Item Source System Target System Platform Red Hat Enterprise Linux Se ...

  8. UVA714- Copying Books(最大最小化)

    意甲冠军:k手稿的部分成m部分,使每一个和最小 思路:典型最大值最小化问题,使用贪心+二分. 贪心的是每次尽量将元素往右边划分,二分查找最小的x满足m个连续的子序列和S(i)都不超过x. 由于输出的原 ...

  9. Java里泛型有什么作用

    1 泛型赋予了类型參数式多态的能力 2 泛型的第一个优点是编译时的严格类型检查,提高了程序的安全性和健壮性,这是集合框架最重要的特点. 3 泛型消除了绝大多数的类型转换.假设没有泛型,当你使用集合框架 ...

  10. hadoop2.0的datanode数据存储文件夹策略的多个副本

    在hadoop2.0在,datanode数据存储盘选择策略有两种方式复制: 首先是要遵循hadoop1.0磁盘文件夹投票,实现类:RoundRobinVolumeChoosingPolicy.java ...