Hibernate的关联关系

一.什么是hibernate的关联关系

hibernate框架是与数据库打交道的,而数据库是存储数据的,有些数据之间有些内在联系,hibernate将对象之间通过某种方式联系起来,世界万物都有联系的,如用户和身份证,你创建了一个用户的一个数据库表,而每个用户要有身份证,所以你还要创建一个装身份证的一个数据库表,但你怎么把它们联系起来,或者说怎么分清楚哪个用户是哪个身份证,这就是我们要学的hibernate的关联关系。

二.hibernate的关联关系内容

我们知道了它大概是干什么的了,现在来了解一下hibernate框架关联关系的具体内容。

在数据库中存在四种关联关系映射,分别是一对一(one-to-one)、一对多(one-to-many)、多对一(many-to-one)和多对多(many-to-many),其中日常开发中比较常用的是一对多和多对一的映射。但这种关系里面又分有单向和双向关系,又分为有主键和外键的关系,下面我讲的关系都是单向和主键之间的关系。

1.单向一对一主键关系
什么是一对一关系呢?刚开始举得例子就是一对一的关系,一个用户只拥有一个身份证,而一个身份证也只对应一个用户,并不存在一个用户拥有多份身份证,下面我讲单向的,通过添加主键来体现关系。

这里写图片描述

在java里:

public class Person {
    private int id;
    private String name;
    private IdCard idCard;//体现一对一的关系。保存映射类的实例对象

在配置文件中:

<hibernate-mapping>
    <class name="com.Person" table="person">
        <id name="id" column="id">
            <generator class="foreign">
            <param name="property">idCard</param>
            </generator>        
        </id>
        <!-- 一些常规属性 -->
        <property name="name"></property>
        <one-to-one name="idCard" constrained="true"></one-to-one>//这里体现一对一关系

    </class>   

IdCard java里和平常配置数据库一样

测试代码

        IdCard idCard = new IdCard();
        idCard.setCardNo("11111111");

        Person person = new Person();
        person.setName("qqq");

        person.setIdCard(idCard);

        session.save(idCard);
        session.save(person);

但这一般都是设成双向的,我们可以通过用户找到身份证,应该通过身份证也要找到用户才对。

2.一对多关系
什么叫做一对多关系?举个例子,就好比班级和学生,站在班级的角度来看,一个班级包含多个学生,那么班级和学生的关系就是一对多的关系。接下来我还是通过添加主键来体现它们的一对多关系。

首先创建学生类Student,里面包含了学生的id、姓名和性别信息。

private int sid;  
private String sname;  
private String sex;  

然后创建班级类Grade,因为是单向一对多的关联,所以需要在Grade中定义一个学生类的集合。

private int gid;    
private String gname;  
private String gdesc;   
private Set<Student> students = new HashSet<Student>();  
//这个体现一个班级对应许多学生

接下来是它们对应的xxx.hbm.xml文件,其它的内容配置都差不多,我只展示一些重要的

<one-to-many class="com.Student" />  //在班级里面的配置文件设置,体现一对多的关系

3.多对一关系
其实多对一和一对多差不多,你说班级和学生是多对一关系,反过来学生和班级不就是一对多关系,不就和上面差不多了吗?只是配置文件修改下就行了,我也不多展示代码了。

4.多对多关系
多对多可能见的多,比如老师和学生,学生知道老师是谁,有哪几个,同样,老师也应该知道他教了那些学生,所以是多对多的关系。下面还是写单向的主键关联。

创建一个teacher类

    private int id;
    private String name;
    private Set<student> students = new HashSet<student>();
    //set get方法省略

在创建一个student类

    private int id;
    private String name;
    //如果是双向的还要有teacher的集合

    //set get方法省略

teacher的xml配置

  <class name="com.xxx.Teacher">

              <id name="id">

                     <generator class="native"/>

              </id>

              <property name="name"/>

              <set name="students" table="t_s">table定义中间表的表名

                     <key column="teacher_id"></key>

                     <many-to-many class="com.xxx.Student" column="student_id"/>

              </set>

</class>

student配置就只要配置创建student表的内容就行了。双向的就需要在student里配置many-to-many,但中间表的名字得一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值