首页 > 代码库 > hibernate学习四(关系映射一对一)

hibernate学习四(关系映射一对一)

一、关系映射简介

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

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

二、一对一单向外键关联

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

  关系图如:

  技术分享

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

 1 package com.model;
 2 
 3 import javax.persistence.Column;
 4 import javax.persistence.Entity;
 5 import javax.persistence.GeneratedValue;
 6 import javax.persistence.Id;
 7 import javax.persistence.Table;
 8 
 9 @Entity
10 @Table(name="teacher")
11 public class Teacher {
12     private int id;
13     private String name;
14     private int age;
15     private String title;
16     
17     @Id
18     @GeneratedValue
19     public int getId() {
20         return id;
21     }
22     public void setId(int id) {
23         this.id = id;
24     }
25     public String getName() {
26         return name;
27     }
28     public void setName(String name) {
29         this.name = name;
30     }
31     public int getAge() {
32         return age;
33     }
34     public void setAge(int age) {
35         this.age = age;
36     }
37     public String getTitle() {
38         return title;
39     }
40     public void setTitle(String title) {
41         this.title = title;
42     }
43 }

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

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

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

  运行测试。

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

三、结果展示

  技术分享

  结果为在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:主键关联忽略,使用时现查现用;

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

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

hibernate学习四(关系映射一对一)