一、关系映射简介

  在数据库中,表与表的关系,仅有外键。但使用hibernate后,为面向对象的编程,对象与对象的关系多样化;如 一对一,一对多,多对多,并具有单向和双向之分。

  开始练习前,复制上一次项目,并更名为

二、一对一单向外键关联

  例如:一个老师只教一个学生,一个学生只能被一个老师教

  关系图如:

  

  修改teahcer.java和student.java类(为了简单起见吧Student也更改为使用Annotation的形式)

 package com.model;

 import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table; @Entity
@Table(name="teacher")
public class Teacher {
private int id;
private String name;
private int age;
private String title; @Id
@GeneratedValue
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}

  接着删除数据库里的teahcer和student表,在hibernate.cfg.xml的配置文件里,有一条

 <property name="hbm2ddl.auto">update</property>

  参数为update时,会在第一次运行时检查是否有表结构,没有则自动生成。我让hibernate自动生成表,看看一对一单向关联的表结构是怎样的。

  运行测试。

 public class Main {
public static void main(String[] args) {
//通过util类创建sessionFactory
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
sessionFactory.close();
}
}

三、结果展示

  

  结果为在student表中出现了一个外键,依赖teacher的主键id,而teacher中并没有外键;

四、一对一双向外键关联

  忽略关系图;

  修改teacher.java,添加属性

    private Student student;
@OneToOne
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}

  删除表,并运行测试;

  结果展示:

  

  

  两张表都生成了一个外键,并依赖另一张表的主键id;

  为了不创建两个外键(效果重复。。。),在其中一个@OneToOne上设置(mappedBy);

  例如在student.java上设置;

@OneToOne(mappedBy="student")
  mappedBy="student" 中student为teacher里的student属性;

  测试运行后,结果只有teacher表中有外键,student表里没有;

PS:建议只要有双向关联,一定要设置mappedBy;

PSS:主键关联忽略,使用时现查现用;

五、组件映射

  将一个普通的类作为一个实体类的一部分,里面的属性作为实体类的表里的字段,叫做组件映射;

  先将teacher.java类里的Annotation删除,并删除id属性,为了避免字段名重复错误,把teacher类里的name和age属性改为teacherName和teacherAge;

 package com.model;

 public class Teacher {
private String teacherName;
private int teacherAge;
private String title; public String getTeacherName() {
return teacherName;
}
public void setTeacherName(String teacherName) {
this.teacherName = teacherName;
}
public int getTeacherAge() {
return teacherAge;
}
public void setTeacherAge(int teacherAge) {
this.teacherAge = teacherAge;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}

  修改student.java;

 package com.model;

 import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table; @Entity
@Table(name="student")
public class Student {
private int id;
private String name;
private int age;
private Teacher teacher; @Id
@GeneratedValue
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Embedded
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
} }

  运行测试;

  没有teacher这张表,student表里多了三个字段;

PS:一对一单向外键关联与一对一双向外键关联在数据库的表的格式是一样的,区别在于

java程序中. 双向外键关联可通过Hibernate在两个类间互相调用彼此,而单向外键关联只能单方向调用。

----------------------------------------------------------------------------------------------------

此文为个人学习记录,如有参考转载,请注明出处 黑白熊的博客 http://www.cnblogs.com/xiong233/

hibernate学习四(关系映射一对一与组件映射)的更多相关文章

  1. Hibernate学习(二)关系映射----基于外键的单向一对一

    事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似.只需要将原来的many-to-one元素增加unique="true"属性, ...

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

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

  3. 【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)

    [SSH进阶之路]Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,採用对象化的思维操作关系型数据库. [SSH进阶之路]Hibernate搭建开发环境+简单实例 ...

  4. (Hibernate进阶)Hibernate映射——一对一双向关联映射(六)

    上一篇博客我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息.如图所示: 关键原因在于对象模型具有方向性: 单向: ...

  5. (Hibernate进阶)Hibernate映射——一对一单向关联映射(五)

    映射原理 两个实体对象之间是一对一的关联映射,即一个对象只能与另外唯一的一个对象相对应.例如:一个人(Person)只有一张身份证(IdCard).我们看一下这个例子的对象模型,如下图所示: 对象模型 ...

  6. 【SSH系列】hibernate映射 -- 一对一双向关联映射

    开篇前言 上篇博文[SSH进阶之路]hibernate映射--一对一单向关联映射,小编介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身 ...

  7. 【SSH系列】Hibernate映射 -- 一对一单向关联映射

     映射原理       一对一关联映射:两个实体对象之间是一对一的关联映射,即一个对象只能与另外唯一的一个对象相对应.有两种策略可以实现一对一的关联映射:       a.主键关联:即让两个对象具有相 ...

  8. 【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)

    上篇博文[SSH进阶之路]Hibernate映射--一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指仅仅能从人(Person)这端载入身份证端(IdCard),可是反过来.不能从身份 ...

  9. Hibernate之关联关系映射(一对一主键映射和一对一外键映射)

    1:Hibernate的关联关系映射的一对一外键映射: 1.1:第一首先引包,省略 1.2:第二创建实体类: 这里使用用户信息和身份证信息的关系,用户的主键编号既可以做身份证信息的主键又可以做身份证信 ...

随机推荐

  1. shell——awk

    awk -F"分隔符" "command" filename awk -F":" '{print $1}' /etc/passwd 字段引用 ...

  2. 编译安装zabbix3.2

    1.1 环境准备 系统环境准备:redhat 6.6 64位mysql-5.6.34php-5.6.28zabbix-3.2.1配置前先关闭iptables和SELINUX,避免安装过程中报错. # ...

  3. 火狐浏览器URL中传中文参数乱码问题

    火狐浏览器:前端页面传中文 <span data-bind=" check_action:'roleMenuPriv'"> <a data-bind=" ...

  4. C++点滴----关于类常成员函数

    关于C++中,类的常成员函数 声明样式为:   返回类型 <类标识符::>函数名称(参数表) const 一些说明: 1.const是函数声明的一部分,在函数的实现部分也需要加上const ...

  5. POJ 2965. The Pilots Brothers' refrigerator 枚举or爆搜or分治

    The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22286 ...

  6. springMVC异常&&重定向&&转发

    SpringMVC核心技术---转发和重定向 当处理器对请求处理完毕后,向其他资源进行跳转时,有两种跳转方式:请求转发与重定向.而根据要跳转的资源类型,又可分为两类:跳转到页面与跳转到其他处理器.对于 ...

  7. LA 3231 - Fair Share

    You are given N processors and M jobs to be processed. Two processors are specified to each job. To ...

  8. 学写js Calender控件

    好几个月没写博客了,一直在赶项目.项目现在终于处于稳定的状态,只是修修改改.作为后台程序员的我真是苦逼啊,从web到手机端接口我都得写,杂七杂八的事情...这两天终于闲下来了,没事儿看了一下关于js日 ...

  9. 每日一记-mybatis碰到的疑惑:String类型可以传入多个参数吗

    碰到一个觉得很疑惑的问题,Mybatis的parameterType为String类型的时候,能够接收多个参数的吗? 背景 初学Mybatis的时候,看的教程和书籍上都是在说基本的数据类型如:int. ...

  10. OC中的多继承

    可以间接实现,方法有: 1.消息转发 2.协议 3.组合模式 4.代理 5.分类 直接上code,分别说明集中方法的实现 一.消息转发 消息转发可以参考我的另外一篇博客:http://www.cnbl ...