转自:https://blog.csdn.net/fengxuezhiye/article/details/7369786?utm_source=blogxgwz9

Hibernate的关联映射关系有:
多对一 ---- many-to-one
一对多 ---- one-to-many
一对一 ---- one-to-one
多对多 ---- many-to-many

比较常用的是多对一和一对一关联映射

多对一关联映射:
场景:用户和组;从用户角度来看,多个用户属于一个组(多对一关联)
使用hibernate开发的思路:先建立对象模型,把实体抽取出来。目前两个实体:用户和组两个实体,多个用户
属于一个组,所有用户实体中应该有一个持有组的引用

对象模型图

关系模型:

关系映射的本质:

将关联关系映射到数据库,所谓的关联关系就是对象模型在内存中的一个或多个引用

User实体类:

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

Group实体类

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

Group实体类映射文件:

  1. <hibernate-mapping>
  2. <class name="com.wjt276.hibernate.Group" table="t_group">
  3. <id name="id" column="id">
  4. <generator class="native"/>
  5. </id>
  6. <property name="name"/>
  7. </class>
  8. </hibernate-mapping>

User实体类映射文件:

  1. <hibernate-mapping>
  2. <class name="com.wjt276.hibernate.User" table="t_user">
  3. <id name="id" column="id">
  4. <generator class="native"/>
  5. </id>
  6. <property name="name"/>
  7. <!--<many-to-one> 关联映射 多对一的关系
  8. name:是维护的属性(User.group),这样表示在多的一端表里加入一个字段名称为group,
  9. 但group与SQL中的关键字重复,所以需要重新命名字段(column="groupid").
  10. 这样这个字段(groupid)会作为外键参照数据库中group表(t_group也叫一的一端),也就是就在多的一
  11. 端加入一个外键指向一的一端。
  12. -->
  13. <many-to-one name="group" column="groupid"/>
  14. </class>
  15. </hibernate-mapping>


<many-to-one>标签

  1. <many-to-one name="group" column="groupid" />

name是维护的属性(User.group),这样表示在多的一端表里加入一个字段名称为group,但group与SQL中的关键字重复,所以需要重新命名字段(column="groupid"),这样这个字段(groupid)会被作为外键参照数据库中的group表,也就是在多的一端加入一个外键指向一的一端。

多对一的存储(先存储group,再保存user)

  1. session = HibernateUtils.getSession();
  2. tx = session.beginTransaction();
  3. Group group = new Group();
  4. group.setName("wjt276");
  5. session.save(group); //存储Group对象。
  6. User user1 = new User();
  7. user1.setName("菜10");
  8. user1.setGroup(group);//设置用户所属的组
  9. User user2 = new User();
  10. user2.setName("容祖儿");
  11. user2.setGroup(group);//设置用户所属的组
  12. //开始存储
  13. session.save(user1);//存储用户
  14. session.save(user2);
  15. tx.commit();//提交事务

注意:如果上面的session.save(group)不执行,则存储不成功。会抛出TransientObjectException异常。因为Group为Transient状,Object的id没有分配值

persistent状态的对象不能引用Transient状态的对象

以上的代码操作,必须首先保存group对象,再保存user对象。我们可以利用cascade(级联)方式,不需要先保存group对象,而是直接保存user对象,这样就可以在存储user之前先把group存储了, 
利用cascade属性是解决TransientObjectException的一种手段

cascade(级联)
  级联的意思是指两个对象之间的操作联运关系,对一个对象执行了操作之后,对其指定的级联对象也需要执行相同的操作,取值:all,none,save_update,delete
  1.all:代码在所有情况下都执行级联操作
  2.none:在所有情况下都不执行级联操作
  3.save-update:在保存和更新的情况下执行级联操作
  4.delete:在删除的时候执行级联操作

  1. <many-to-one name="groupo" column="groupid" cascade="save_update" />

多对一 加载数据

  1. session = HibernateUtils.getSession();
  2. tx = session.beginTransaction();
  3. User user = (User)session.load(User.class, 3);
  4. System.out.println("user.name=" + user.getName());
  5. System.out.println("user.group.name=" + user.getGroup().getName());
  6. //提交事务
  7. tx.commit();

因为采用了<many-to-one>这个标签,这个标签会在多的一端(User)加一个外键,指向一的一端(Group),也就是它维护了从多到一的这种关系,多指向一的关系。当你加载多一端的数据时,它能把一的这一端的数据加载上来。当加载User对象后hibernate会根据User对象中的groupid再来加载Group信息给User对象中的group属性

Hibernate关联映射(多对一 --- many-to-one)的更多相关文章

  1. (转)Hibernate关联映射——一对多(多对一)

    http://blog.csdn.net/yerenyuan_pku/article/details/70152173 Hibernate关联映射——一对多(多对一) 我们以客户(Customer)与 ...

  2. Hibernate关联映射(一对多/多对多)

    版权声明:翀版 https://blog.csdn.net/biggerchong/article/details/843401053.  Hibernate关联映射上接Hibernate持久化类:h ...

  3. Hibernate关联映射关系

    Hibernate关联映射关系 一.双向一对多关联映射关系:当类与类之间建立了关联,就可以方便的从一个对象导航到另一个或另一组与它关联的对象(一对多双向关联和多对一双向关联是完全一样的) 1.1创建实 ...

  4. 第六章 Hibernate关联映射

    第六章 hibernate关联映射一.本章知识点分为2部分:1.关联关系:单向多对一关联关系,双向一对多关联关系(含一对多关联关系),多对多关联关系2.延迟加载:类级别加载策略,一对多加载策略,多对一 ...

  5. 【学习笔记】Hibernate关联映射(Y2-1-6)

    Hibernate关联映射 关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用. 1.单向多对一关联 准备数据库 部门表和员工表 其中部门表有两列 部门编号和名称 员工表有三列 员工 ...

  6. 第三章Hibernate关联映射

    第三章Hibernate关联映射 一.关联关系 类与类之间最普通的关系就是关联关系,而且关联是有方向的. 以部门和员工为列,一个部门下有多个员工,而一个员工只能属于一个部门,从员工到部门就是多对一关联 ...

  7. (转)Hibernate关联映射——对象的三种关系

    http://blog.csdn.net/yerenyuan_pku/article/details/70148618 Hibernate关联映射——对象的三种关系 Hibernate框架基于ORM设 ...

  8. Oracle primary,unique,foreign 区别,Hibernate 关联映射

    Oracle primary,unique,foreign 区别 转:http://www.cnblogs.com/henw/archive/2012/08/15/2639510.html NOT N ...

  9. Hibernate关联映射(单项多对一和一对多、双向一对多)

    最近总是接触着新的知识点来扩展自己的知识面:不停的让自己在原地接触天空的感觉真的很美好!!!革命没有成功,程序员的我们怎么能不努力呢...... 一.用员工和部门来剖析关联映射的原理. 1)从这张截图 ...

随机推荐

  1. 【转】SQL Server 创建约束图解 唯一 主键-界面操作

    SQL Server 创建约束图解 唯一 主键-界面操作 SQLServer中有五种约束,Primary Key约束.Foreign Key约束.Unique约束.Default约束和Check约束, ...

  2. BZOJ 2308 莫队入门经典

    题目链接  https://www.lydsy.com/JudgeOnline/problem.php?id=2038 参考博客 https://www.cnblogs.com/Paul-Guderi ...

  3. File类的三种构造方法

    package cn.zmh.File; import java.io.File; /* * * File类的构造方法 三种重载形式 * * */ public class FileDemo1 { p ...

  4. burpsuite破解版

    来源:http://www.vuln.cn/8847

  5. 原来,表名和字段名不能在pdo中“参数化查询”

    https://stackoverflow.com/questions/182287/can-php-pdo-statements-accept-the-table-or-column-name-as ...

  6. CSDN管理员看过来

    CSDN管理员看过来 你好.CSDN管理员,我想我被特殊对待了.我看了一些人的博客.终于发现仅仅有我博客的数据有异常.这算是给我的惊喜吗? 言归正传,我发现我博客上两个地方出现的文章的总数对不上.原创 ...

  7. Java中常见的排序算法

    这是我摘取的一段英文资料.我认为学习算法之前,对各种排序得有个大致的了解: Sorting algorithms are an important part of managing data. At ...

  8. hdoj 5093 Battle ships 【二分图最大匹配】

    题目:pid=5093" target="_blank">hdoj 5093 Battle ships 题意:给你一个n*m的图,图中有冰山 '# ',浮冰 'o' ...

  9. Codeforces 480B Long Jumps 规律题

    题目链接:点击打开链接 题意: 输出n l x y 有一根直尺长度为l 上面有n个刻度. 以下n个数字是距离开头的长度(保证第一个数字是0,最后一个数字是l) 要使得 直尺中存在某2个刻度的距离为x ...

  10. (八)unity4.6Ugui中文教程文档-------概要-UGUI Rich Text

    大家好,我是孙广东. 转载请注明出处:http://write.blog.csdn.net/postedit/38922399 更全的内容请看我的游戏蛮牛地址:mod=guide&view ...