Hibernate 一对一、一对多、多对多注解mappedBy属性的总结
mappedBy:
所填内容必为本类在另一方的字段名。
表示:本类放弃控制关联关系,所有对关联关系的控制,如:建立、解除与另一方的关系,都由对方控制,本类不管。举个例子:
Teacher和Student之间是多对多关联关系,在Student端的teachers字段的@ManyToMany注解里面,配置属性mappedBy = "students"。表示:学生没有资格控制与老师的关联关系(如:建立关系、删除关系),只有老师才有资格控制关联关系。学生不能说:”我们两做朋友吧“。(即使说了,也无济于事,老师当学生没说。即Hibernate把学生说的当作耳边风,虽然Hibernate也不会抛出异常,程序照样能运行)。但是,老师可以说,“我们做朋友吧”。那么,学生只能无任何拒绝理由地接受。同样,如果学生说,”我们从此一刀两断吧“,那也是没用的。只有老师说:“滚,有多远,滚多远,为师今日将你逐出师门,再也不想见到你”,那么,这才能有效地解除关联关系(注意:这是一个对象(对应数据库里的一行记录)和一个对象之间的关系,而不是表和表之间的关联关系。一对师生关系的解除,不能影响整个社会的师生关系)。
测试代码:(这是完整类,后面只贴出test1的代码,其他部分不变)
public class MappedByTest {
private static SessionFactory sessionFactory;
private Session session;
@BeforeClass
public static void beforeTest(){
sessionFactory = HibernateUtil.getSessionFactory();
}
@AfterClass
public static void afterTest(){
sessionFactory.close();
}
@Before
public void beginTransaction(){
session = sessionFactory.openSession();
session.beginTransaction();
}
@After
public void commitTransaction(){
session.getTransaction().commit();
session.close();
}
@Test
public void execute(){
test1();
}
public void test1(){
Student student1 = new Student("学生张三",3);
Student student2 = new Student("学生李四",4);
Teacher teacher1 = new Teacher("老师王五",5);
Teacher teacher2 = new Teacher("老师赵六",6);
List<Student> students = new ArrayList<>();
students.add(student1);
students.add(student2);
List<Teacher> teachers = new ArrayList<>();
teachers.add(teacher1);
teachers.add(teacher2);
session.save(teacher1);
session.save(teacher2);
student1.setTeachers(teachers);
session.save(student1);
}
}
产生的结果:

----------------------------------------------------------------------------------------
然后,清空数据库,做第二次测试:
public void test1() {
Student student1 = new Student("学生张三", 3);
Student student2 = new Student("学生李四", 4);
Teacher teacher1 = new Teacher("老师王五", 5);
Teacher teacher2 = new Teacher("老师赵六", 6);
List<Student> students = new ArrayList<>();
students.add(student1);
students.add(student2);
List<Teacher> teachers = new ArrayList<>();
teachers.add(teacher1);
teachers.add(teacher2);
session.save(student1);
session.save(student2);
teacher1.setStudents(students);
session.save(teacher1);
}
产生的结果:

可见:在Student类的teachers字段的@ManyToMany注解上配置属性mappedBy = "students",所有Student类产生的对象均不能建立和老师的关联关系,只有老师可以。
----------------------------------------------------------------------------------------
然后,清空数据库,做第三次测试:
public void test1(){
Student student1 = new Student("学生张三",3);
Student student2 = new Student("学生李四",4);
Teacher teacher1 = new Teacher("老师王五",5);
Teacher teacher2 = new Teacher("老师赵六",6);
List<Student> students = new ArrayList<>();
students.add(student1);
students.add(student2);
List<Teacher> teachers = new ArrayList<>();
teachers.add(teacher1);
teachers.add(teacher2);
int stuId = 4;
int teacherId = 6;
Student persistentStudent = (Student)session.get(Student.class, stuId);
Teacher persistentTeacher = (Teacher)session.get(Teacher.class, teacherId);
persistentStudent.getTeachers().remove(persistentTeacher);
session.update(persistentStudent);
}
控制台打出的SQL语句:
Hibernate:
select
student0_.student_id as student_1_0_0_,
student0_.age as age2_0_0_,
student0_.name as name3_0_0_
from
student student0_
where
student0_.student_id=?
Hibernate:
select
teacher0_.teacher_id as teacher_1_1_0_,
teacher0_.age as age2_1_0_,
teacher0_.name as name3_1_0_
from
teacher teacher0_
where
teacher0_.teacher_id=?
Hibernate:
select
teachers0_.student_id as student_2_2_0_,
teachers0_.teacher_id as teacher_1_2_0_,
teacher1_.teacher_id as teacher_1_1_1_,
teacher1_.age as age2_1_1_,
teacher1_.name as name3_1_1_
from
ts_relation teachers0_
inner join
teacher teacher1_
on teachers0_.teacher_id=teacher1_.teacher_id
where
teachers0_.student_id=?
产生的结果:

----------------------------------------------------------------------------------------
然后,清空数据库,做第四次测试:
public void test1(){
Student student1 = new Student("学生张三",3);
Student student2 = new Student("学生李四",4);
Teacher teacher1 = new Teacher("老师王五",5);
Teacher teacher2 = new Teacher("老师赵六",6);
List<Student> students = new ArrayList<>();
students.add(student1);
students.add(student2);
List<Teacher> teachers = new ArrayList<>();
teachers.add(teacher1);
teachers.add(teacher2);
int stuId = 4;
int teacherId = 6;
Student persistentStudent = (Student)session.get(Student.class, stuId);
Teacher persistentTeacher = (Teacher)session.get(Teacher.class, teacherId);
persistentTeacher.getStudents().remove(persistentStudent);
session.update(persistentTeacher);
}
控制台打出的SQL语句:
Hibernate:
select
student0_.student_id as student_1_0_0_,
student0_.age as age2_0_0_,
student0_.name as name3_0_0_
from
student student0_
where
student0_.student_id=?
Hibernate:
select
teacher0_.teacher_id as teacher_1_1_0_,
teacher0_.age as age2_1_0_,
teacher0_.name as name3_1_0_
from
teacher teacher0_
where
teacher0_.teacher_id=?
Hibernate:
select
students0_.teacher_id as teacher_1_2_0_,
students0_.student_id as student_2_2_0_,
student1_.student_id as student_1_0_1_,
student1_.age as age2_0_1_,
student1_.name as name3_0_1_
from
ts_relation students0_
inner join
student student1_
on students0_.student_id=student1_.student_id
where
students0_.teacher_id=?
Hibernate: --------------------------注意这条
delete
from
ts_relation
where
teacher_id=?
Hibernate:
insert
into
ts_relation
(teacher_id, student_id)
values
(?, ?)
产生的结果:

可见:在Student类的teachers字段的@ManyToMany注解上配置属性mappedBy = "students",所有Student类产生的对象均不能删除和老师的关联关系,只有老师可以。
----------------------------------------------------------------------------------------
由此证明了之前所说的,mappedBy表示,本类防止控制和另一方的关联关系,所填内容必为本类在另一方的字段名。
注意:mappedBy和@JoinTable是互斥的,也就是说,@"关联关系注解"里面写了mappedBy属性,下面就不能再写@JoinTable。否则,Hibernate报异常。
Hibernate 一对一、一对多、多对多注解mappedBy属性的总结的更多相关文章
- JPA级联(一对一 一对多 多对多)注解【实际项目中摘取的】并非自己实际应用
下面把项目中的用户类中有个:一对一 一对多 多对多的注解对应关系列取出来用于学习 说明:项目运行正常 问题类:一对多.一对一.多对多 ============一对多 一方的设置 @One ...
- Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作
Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: 由于如果只使用一张表存储所有的数据,就会操作数 ...
- mybatis 一对一 一对多 多对多
一对一 一对多 多对多
- hibernate 双向一对多关系(Annotation mappedBy注解理解)
1.@mappedBy 属性简单理解为设定为主表(OneToMany方)(这只是我个人理解,上面文章中也有提到过) 所以另一端(ManyToOne)则需要设置外键@JoinColumn(name=&q ...
- JPA 一对一 一对多 多对一 多对多配置
1 JPA概述 1.1 JPA是什么 JPA (Java Persistence API) Java持久化API.是一套Sun公司 Java官方制定的ORM 方案,是规范,是标准 ,sun公司自己并没 ...
- 使用NHibernate(7)-- 一对一 && 一对多 && 多对多
1, 一对一. 对于数据量比较大的时候,考虑查询的性能,肯能会把一个对象的属性分到两个表中存放:比如用户和用户资料,经常使用的一般是Id和用户名,用户资料(学校,籍贯等)是不经常被查询的,所以就会分成 ...
- day 69-70 一对一 一对多 多对一联表查询
day 69 orm操作之表关系,多对多,多对一 多对一/一对多, 多对多{类中的定义方法} day69 1. 昨日内容回顾 1. 单表增删改查 2. 单表查询API 返回QuerySet对象的: 1 ...
- 2018.11.4 Hibernate中一对、多对多的关系
简单总结一下 多表关系 一对多/多对一 O 对象 一的一方使用集合. 多的一方直接引用一的一方. R 关系型数据库 多的一方使用外键引用一的一方主键. M 映射文件 一: 多: 操作: 操作管理级别属 ...
- Hibernate 一对一、一对多、多对多注解cascade属性的总结
作用:是否级联被注解字段里面的对象.可选值:javax.persistence.CascadeType.PERSIST, MERGE, REMOVE, REFRESH, DETACH, ALL.可选其 ...
随机推荐
- 更新pip源,提高python下载安装包速度的方式(window及linux)
python需要经常安装各种模块,而pip是很强大的模块安装工具,自带的pip下载源在国外,导致每次下载速度太慢,所以我们最好是将自己使用的pip源更换更换成国内的下载源可提高开发效率 linux环境 ...
- 将海康大华等网络摄像机RTSP流进行网页Flash rtmp和H5 hls直播的技术方案
前言 再小的技术点也会有他的市场! 一直以来,都有一些不被看好,认为是成本太高,无法大规模展开的软件和产品形态,就好比每一座城市都会有他的著名小吃一样,即使是慕名而来的人源源不断,受众群体也总是有限, ...
- ng开启缓存 造成的问题:
开启缓存 造成的问题:
- Android中的“再按一次返回键退出程序”实现 (转) 按返回键退出程序时进行提醒
原文地址: https://blog.csdn.net/xichenguan/article/details/47030303 最近在研究 Android 编程方面的东西, 有了以下发现, 该 ...
- Docker学习(三)docker容器操作
上一篇:Docker学习(二)docker镜像操作 容器是基于镜像创建的,说白了把一个镜像运行起来就是容器 查看容器 docker ps 上面什么也没有,因为我们没有正在运行的容器,下面我门启动一个容 ...
- 【2018.06.26NOIP模拟】T3节目parade 【支配树】*
[2018.06.26NOIP模拟]T3节目parade 题目描述 学校一年一度的学生艺术节开始啦!在这次的艺术节上总共有 N 个节目,并且总共也有 N 个舞台供大家表演.其中第 i 个节目的表演时间 ...
- BZOJ2342 Shoi2011 双倍回文 【Manacher】
BZOJ2342 Shoi2011 双倍回文 Description Input 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. Output 输 ...
- excel怎么一次性生成10万个6位连续数 和 随机6位数
1.打开工作表,在名称框输入A1:A100000 2.编辑栏输入 =int(rand()*900000+100000) 3.按ctrl+enter 需要提取的话,马上ctrl+c就可以在其它软件中粘贴 ...
- css 常用类名
1.页面结构 容器: container 页头:header 内容:content/container 页面主体:main 页尾:footer 导航:nav 侧栏:sidebar 栏目:column ...
- HAL层编写规范
andriod HAL模块也有一个通用的入口地址,这个入口地址就是HAL_MODULE_INFO_SYM变量,通过它,我们可以访问到HAL模块中的所有想要外部访问到的方法. 在Linux系统中,后缀 ...