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的数据库操作不一样,但目的都是一个:维护数据的一致性。
  • 相关阅读:
    java实现 洛谷 P1425 小鱼的游泳时间
    java实现 洛谷 P1425 小鱼的游泳时间
    java实现 洛谷 P1425 小鱼的游泳时间
    java实现 洛谷 P1425 小鱼的游泳时间
    Java实现洛谷 P1428 小鱼比可爱
    Java实现洛谷 P1428 小鱼比可爱
    Java实现洛谷 P1428 小鱼比可爱
    阿里面试题总结
    BAT机器学习面试1000题系列
    就目前市面上的面试整理来说,最全的BAT大厂面试题整理在这
  • 原文地址:https://www.cnblogs.com/Yxxxxx/p/6759745.html
Copyright © 2011-2022 走看看