码迷,mamicode.com
首页 > 其他好文 > 详细

hihernate一对多关联映射

时间:2017-04-25 00:50:04      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:date   ber   数据库   组成   string   ring   理论   设立   单向一对多   

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的数据库操作不一样,但目的都是一个:维护数据的一致性。

hihernate一对多关联映射

标签:date   ber   数据库   组成   string   ring   理论   设立   单向一对多   

原文地址:http://www.cnblogs.com/Yxxxxx/p/6759745.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!