zoukankan      html  css  js  c++  java
  • hihernate一对多关联映射

    hihernate一对多关联映射

    一对多关联映射利用了多对一关联映射原理

    多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一
    一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多

    举个例子员工和老板。你说是老板记员工比较容易还是员工记老板比较容易呢?很明显记少的比较容易啊,能维护二者的关系也能减少工作量。hibernate当然也是这么做的。

    也就是说一对多和多对一的映射策略是一样的,只是站的角度不同


    在关系型数据库理论中,“多对一”关联同于“一对多”关联,且为了消除数据冗余,在两个关系之间不存在“多对多”关联,“多对多”关联要通过连接表来实现。因此在关系型数据库中只有“一对一”和“一对多(多对一)”,且都是单向的。

    以教师与学生的关系举例,一个学生一门课有一个教师,一个教师一门课就有多个学生。

    多对一:(即单向一对多)
    public class Teacher{
    private int teacher_id;
    private String teacher_name;
    ......
    }

    public class Student{
    private int student_id;
    private String student_name;
    .......
    private Teacher teacher;
    //多个学生对一门课程一个老师
    }

    一对多:
    public class Teacher{
    private int teacher_id;
    private String teacher_name;
    ......
    private Set<Student> student;
    //一个老师对一门课程多个学生
    }

    public class Student{
    private int student_id;
    private String student_name;
    .......
    }


    双向一对多,即一对多+单向一对多

    public class Teacher{
    private int teacher_id;
    private String teacher_name;
    ......
    private Set<Student> student;
    //一个老师对一门课程多个学生
    }

    public class Student{
    private int student_id;
    private String student_name;
    .......
    private Teacher teacher;
    //多个学生对一门课程一个老师
    }

    Inverse:负责控制关系,决定是有谁来维护表和表之间的关系的,默认为false。

    也就是关系的两端都能控制,但这样会造成一些问题,更新的时候会因为两端都控制关系,于是重复更新。一般来说有一端要设为true。

    set的inverse属性决定是否把对set的改动反映到数据库中去。inverse=false————反映;inverse=true————不反映”inverse属性默认为false

    我们说inverse设立不当会导致性能低下,其实是说inverse设立不当,会产生多余重复的SQL语句甚至致使JDBC exception的throw。这是我们在建立实体类关系时必须需要关注的地方。

    一般来说,inverse=true是推荐使用,
    双向关联中双方都设置 inverse=false的话,必会导致双方都重复更新同一个关系。
    但是如果双方都设立inverse=true的话,双方都不维护关系的更新,这也是 不行的。

    好在一对多中的一端:many-to-one默认是inverse=false,避免了这种错误的产生。
    但是多对多就没有这个默认设置了,所以很 多人经常在多对多的两端都使用inverse=true,结果导致连接表的数据根本没有记录,就是因为他们双分都没有责任维护关系。

    所以说,双向关联中最 好的设置是一端为inverse=true,一端为inverse=false。

    一般inverse=false会放在多的一端,那么有人提问了, many-to-many两边都是多的,inverse到底放在哪儿?其实hibernate建立多对多关系也是将他们分离成两个一对多关系,中间连接一个连接表。所以通用存在一对多的关系,也可以这样说:一对多是多对多的基本组成部分。

    (1)对one-to-many而言 (设置inverse=false),改变set,会让hibernate执行一系列的update语句。
    (2)对many-to-many而言,改变set,只修改关系表的数据,不会影响many-to-many的另一方。
    (3)虽然one-to-many和many-to-many的数据库操作不一样,但目的都是一个:维护数据的一致性。
  • 相关阅读:
    mysql命令集锦
    linux 删除文件名带括号的文件
    linux下的cron定时任务
    struts2文件下载的实现
    贴一贴自己写的文件监控代码python
    Service Unavailable on IIS6 Win2003 x64
    'style.cssText' is null or not an object
    "the current fsmo could not be contacted" when change rid role
    远程激活程序
    新浪图片病毒
  • 原文地址:https://www.cnblogs.com/Yxxxxx/p/6759745.html
Copyright © 2011-2022 走看看