一、整理思路:

之前,小编总结过Mybatis的关联映射,接下来,再来总结一下hibernate的相关的关联映射,直接上图:

这张图,就是小编整理总结整个Hibernate的关联映射的一个大致思路。

二、名词解释“

1、单向关联:很简单,就是一个对象依赖于另一个对象。

2、双向关联:两个对象互相依赖。

三、一对一(one-to-one)关联映射:

所谓的一对一,大白话理解就是一个物件拥有的某种附属物件能而且只能拥有一件。举个例子就是作为学生,一个学生只能拥有一个有效的学生证,一个堂堂正正的中国公民也只能拥有一张有效的身份证。这就是一对一。接下来,我们就利用在职学生为例,说一下一对一映射。

在Hibernate中有两种方式能实现一对一映射,分别是:

1、主键关联;

2、唯一外键关联。

四、逐一介绍:

4.1、一对一单向关联映射

4.1.1、一对一单向关联映射——主键关联

核心:一个对象依赖于另一个对象。举例:根据学生,找到对应的有效学生证。

Po对象设计:

StudentCard.Java:

  1. public class StudentCard{
  2. private int id;
  3. private String cardNo;
  4. //getter\setter方法
  5. }

Student.java:

  1. public class Student{
  2. private int id;
  3. private String name;
  4. private StudentCard studentCard;
  5. //getter\setter
  6. }

映射文件:

StudentCard.hbm.xml

  1. <hibernate-mapping package="org.hibernate.test" >
  2. <class name="com.ssh.hibernate.StudentCard" table="t_studentCard">
  3. <id name="id">
  4. <generator class="native"/>
  5. </id>
  6. <property name="cardNo"/>
  7. </class>
  8. </hibernate-mapping>

Student.hbm.xml

  1. <hibernate-mapping package="org.hibernate.test" >
  2. <class name="com.ssh.hibernate.Person" table="t_student">
  3. <id name="id" type="int">
  4. <generator class="foreign">
  5. <param name="property">studentCard</param>
  6. </generator>
  7. </id>
  8. <one-to-one name="studentCard" constrained="true"/>
  9. <property name="name"/>
  10. </class>
  11. </hibernate-mapping>

分析:核心<one-to-one name="studentCard" constrained="true"/>,表示一个Student对应一个StudentCard。constrained=”true”表示t_student表的主键上同时有个外键指向被关联的表(t_studentCard)的主键,会对表t_student创建约束,约束t_student的id只能跟studentCard的主键一样,也就是说,Student上的id既是主键也是外键。

测试

  1. session.beginTransaction();
  2. StudentCard studentCard=new StudentCard();
  3. studentCard.setCardNo("12050242013");//我在学校里的学号
  4. Student student=new Student();
  5. student.setName("Davie");
  6. person.setstudentCard(student);
  7. session.save(person);
  8. session.getTransaction().commit();

这时,会先插入一条StudentCard信息,然后再插入Student信息:

  1. insert into t_studentCard (cardNo) values (?)
  2. insert into t_student (name, id) values (?, ?)

4.2.2、一对一单向关联映射——唯一外键关联

核心:唯一外键关联,就是给一对一关联关系中某个对象加一个外键。举例:给Student表添加一个外键,指向StudentCard的主键,而且外键唯一,这样也就达到了一对一映射的效果。

Po对象设计:

StudentCard.java:

  1. public class StudentCard{
  2. private int id;
  3. private String cardNo;
  4. //getter\setter方法
  5. }

Student.java:

  1. public class Student{
  2. private int id;
  3. private String name;
  4. private StudentCard studentCard;
  5. //getter\setter
  6. }

映射文件:

StudentCard.hbm.xml

  1. <hibernate-mapping package="org.hibernate.test" >
  2. <class name="com.ssh.hibernate.StudentCard" table="t_studentCard">
  3. <id name="id">
  4. <generator class="native"/>
  5. </id>
  6. <property name="cardNo"/>
  7. </class>
  8. </hibernate-mapping>

Student.hbm.xml

  1. <hibernate-mapping package="org.hibernate.test" >
  2. <class name="com.ssh.hibernate.Person" table="t_student">
  3. <id name="id" type="int">
  4. <generator class="foreign">
  5. <param name="property">studentCard</param>
  6. </generator>
  7. </id>
  8. <many-to-one name="studentCard" unique="true"/><!--unique="true"会对此外键生成唯一约束-->
  9. <property name="name"/>
  10. </class>
  11. </hibernate-mapping>

分析:

这里与主键关联还有点不一样,t_student的主键生成策略是native,不再以未见形式关联到t_studentCard的主键,用<many-to-one>标签与t_idcard建立多对一的关系,这样就可以在t_student中生成一个外键关联到t_studentCard的主键。

这时候如果还用上面的测试代码进行测试,就会报错:“org.hibernate.TransientObjectException: object references an unsaved transient instance”

因为t_student的主键生成策略是native,和t_studentCard无关,而studentCard并没有变成TransientObject,所以,我们必须要先将studentCard变成持久化对象:

  1. session.beginTransaction();
  2. StudentCard studentCard=new StudentCard();
  3. studentCard.setCardNo("12050242013");//我在学校里的学号
  4. session.save(studentCard);
  5. Student student=new Student();
  6. student.setName("Davie");
  7. person.setstudentCard(student);
  8. session.save(person);
  9. session.getTransaction().commit();

4.2、一对一双向关联映射

4.2.1一对一双向关联映射——主键关联

核心:两个对象之间,相互依赖

Po对象

StudentCard.java

  1. public class StudentCard{
  2. private int id;
  3. private String cardNo;
  4. private Student student;
  5. //getter\setter方法
  6. }

Student.java

  1. public class Student{
  2. private int id;
  3. private String name;
  4. private StudentCard studentCard;
  5. //getter\setter
  6. }

配置文件:

StudentCard.hbm.xml

  1. <hibernate-mapping package="org.hibernate.test" >
  2. <class name="com.ssh.hibernate.StudentCard" table="t_studentCard">
  3. <id name="id">
  4. <generator class="native"/>
  5. </id>
  6. <property name="cardNo"/>
  7. <one-to-one name="student" fetch="join">
  8. <!--fetch值为select时,可以实现懒加载,而且这里constrained不能为true,否则会两张表主键相互依赖,导致死循环-->
  9. </class>
  10. </hibernate-mapping>

Student.hbm.xml

  1. <hibernate-mapping package="org.hibernate.test" >
  2. <class name="com.ssh.hibernate.Person" table="t_student">
  3. <id name="id" type="int">
  4. <generator class="foreign">
  5. <param name="property">studentCard</param>
  6. </generator>
  7. </id>
  8. <one-to-one name="studentCard" constrained="true"/>
  9. <property name="name"/>
  10. </class>
  11. </hibernate-mapping>

测试如上,我们查出Student时,Student.studentCard可以获取学生证信息。当我们查出StudentCard时,StudentCard.student可以获取学生信息。但是也正是因为他们之间是这种关系,没有相互的约束,所以当我们执行:

  1. session.beginTransaction();
  2. Student student=new Student();
  3. student.setName("Davie");
  4. StudentCard studentCard=new StudentCard();
  5. studentCard.setCardNo("12050242013");
  6. studentCard.setPerson(person);
  7. session.save(studentCard);
  8. session.getTransaction().commit();

session只会save(studentCard),而不会save(student);

4.2.2一对一双向关联映射——唯一外键关联

直接上配置了:

Po对象设计:

StudentCard.java

  1. public class StudentCard{
  2. private int id;
  3. private String cardNo;
  4. private Student student;
  5. //getter\setter方法
  6. }

Student.java

  1. public class Student{
  2. private int id;
  3. private String name;
  4. private StudentCard studentCard;
  5. //getter\setter
  6. }

配置文件:

StudentCard.hbm.xml

  1. <hibernate-mapping package="org.hibernate.test" >
  2. <class name="com.ssh.hibernate.StudentCard" table="t_studentCard">
  3. <id name="id">
  4. <generator class="native"/>
  5. </id>
  6. <property name="cardNo"/>
  7. <one-to-one name="student" property-ref="studentCard">
  8. </class>
  9. </hibernate-mapping>

Student.hbm.xml

  1. <hibernate-mapping package="org.hibernate.test" >
  2. <class name="com.ssh.hibernate.Person" table="t_student">
  3. <id name="id" type="int">
  4. <generator class="foreign">
  5. <param name="property">studentCard</param>
  6. </generator>
  7. </id>
  8. <one-to-one name="studentCard" constrained="true"/>
  9. <property name="name"/>
  10. </class>
  11. </hibernate-mapping>

一张身份证只对应一位公民,所以用<one-to-one>标签,property-ref="studentCard"指t_studentCard的主键与t_student中的studentCard字段对应。

到此,关于一对一映射的相关知识告一段落,但是大家要知道,唯一外键关联其实就是多对一关联的一种特殊情况,所以当我们需求变了,要求有一对一变成多对一的时候,我们该怎么办呢?其实很简单,直接把外键唯一的约束干掉就可以了,是不是方便很多呢?

【Hibernate框架】关联映射(一对一关联映射)的更多相关文章

  1. Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射

                                                        Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射 Hibernate提供了两 ...

  2. Hibernate之映射一对一关联

    一.一对一关联的概念: 一对一之间的关联是指:两张表中的信息是一对一的关系,比如我们每个人和身份证的关系,一个人对应一张身份证,一张身份证也只能对应一个人. Hibernate提供了两种映射一对一关联 ...

  3. Hibernate 、多表关联映射 - 一对一关系映射(one- to-one)

    hibernate.cfg.xml: <hibernate-configuration> <session-factory name="sessionFactory&quo ...

  4. SSH:Hibernate框架(七种关联关系映射及配置详解)

    概念 基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一个或多个引用. 分类 关联关系分为上述七种,但是由于相互之间有各种关系, ...

  5. (转)Hibernate框架基础——一对多关联关系映射

    http://blog.csdn.net/yerenyuan_pku/article/details/52746413 上一篇文章Hibernate框架基础——映射集合属性详细讲解的是值类型的集合(即 ...

  6. hibernate的基础学习--一对一关联

    一对一关系以丈夫和妻子模型 配置文件 妻子配置文件: <?xml version="1.0" encoding="utf-8" ?> <!DO ...

  7. Hibernate框架单向多对一关联映射关系

    建立多对一的单向关联关系    Emp.java            private Integer empNo //员工编号            private String empName / ...

  8. Hibernate框架双向多对多关联映射关系

    建立双向多对多关联关系    Project.java (项目表)                private Integer proid;                private Strin ...

  9. Hibernate框架单向多对多关联映射关系

    建立单向多对多关联关系    Project.java (项目表)                private Integer proid;                private Strin ...

  10. 【Hibernate框架】三种继承映射

    一.综述 大家都知道,hibernate作为ORM框架的一个具体实现,最大的一个优点就是是我们的开发更加的能体现出"面向对象"的思想.在面向对象开发中,类与类之间是可以相互继承的( ...

随机推荐

  1. 前端面霸系列(1):doctype 、Quirks Mode & Standards Mode 、document.compatMode

    近几日,气压猛降,雾霾铺天盖地,眼看一场腥风血雨就要在前端江湖爆发,这场战争不仅是百度.腾讯.阿狸.搜狐网易新浪等江湖豪门抢夺人才的大战,也是诸位江湖人士重新洗牌的好时机.每年10月,江湖的波动胜过华 ...

  2. 推荐几款我一直在用的chrome插件(下)

    请先看:推荐几款我一直在用的chrome插件(上) 6. Pocket 可以很方便的保存文章.视频等供以后查看,即实现了“Read it later”功能.有了 Pocket,您可以将所有想下次读的内 ...

  3. spring MVC mybatis dispacherServlet(源码解读)

    以下源码版本(4.2.0.RELEASE) dispacherServlet是servlet的实现类,是spring MVC的前端转发器,是spring MVC的核心. 那么它做了哪些事呢? 它主要做 ...

  4. 第一届山东省ACM——Balloons(java)

    Description Both Saya and Kudo like balloons. One day, they heard that in the central park, there wi ...

  5. java 解 poj 1000

    import java.util.Scanner; public class A1000 { public static void main(String[] args) { Scanner sc=n ...

  6. mysql语句入门

    show databases;      展示可以用的数据库: use employees;        进入数据库: show tables;             展示可用的列表.   sho ...

  7. telnet 传输文件

    用python创建个临时服务器,发送文件供telnet访问 import socket import base64 port = 10005 filename = 'libcrypto.so.1.0. ...

  8. 修改git remote url

    $ ssh -v wangz@gitlab.alibaxx-inc.com $ git remote ali set-url git@gitlab.alibaxx-inc.com:youk-aaa/x ...

  9. C#高级编程笔记 2016年10月26日 MVC入门 Controller

    1.MVC的定义:   Models: Classes that represent the data of the application  and that use validation logi ...

  10. java中HttpServletRequest常用获取url、资源名等方法总结

    HttpServletRequest客户端获取请求,客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中.所以我们能够从对象中获取相应信息   端口 request.get ...