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.可选其 ...
随机推荐
- 20165202 week4课下补做
1.相关知识点的总结 编程实现1!+2!+3!+... + N!的功能,N由命令行传入,比如类名为SumofRecur, java SumofRecur 8 给出1!+2!+3!+... + 8!的值 ...
- CString与输入输出流对象问题。
在C++ 编程出现:cin>>Id;没有与这些操作匹配的">>"运算符: 你要看你的Id的数据类型,如果是CString等字符串,要用cin.getline ...
- echarts-detail---饼图
echarts-饼图 1.饼图上面显示纵坐标的百分比数值 series: [ { name: arr[i].name, type: 'pie', radius: ['30%', '50%'], avo ...
- 如何制作dll库的API文档,自动生成微软风格的chm文件 Sandcastle Help File Builder 使用方法
当你开发了一个库的时候,就需要给库开发一个api文档,微软提供了一个C#库的自动生成工具.我在使用的过程中记录了相关的信息,以供大家学习和查阅,如有不正之处,欢迎指出. 首先先下载一个软件,下载地址在 ...
- js里获取html真实舞台宽高
var winSize = {width:document.documentElement.clientWidth,height:document.documentElement.clientHeig ...
- Python IDE in Sublime
(最近换了电脑,然后忘了把 ST 的配置搬过来,所以重新折腾了一遍 Sublime 中的 Python 环境配置) 以下插件均通过 Package Control 安装. SublimeREPL 快捷 ...
- maven报错【Could not calculate build plan: Plugin org.apache.maven.plugins:maven-resources-plugin:2.6 or one of】
[自己的操作] (1)windows -> Preferences -> maven 的settings.xml文件中.m2的位置已经失效,更改正确后尝试 (2)pom.xml还有下面错误 ...
- 20179223《Linux内核原理与分析》第一周学习笔记
第一周实验 尝试创建两个文件,用通配符查找这两个文件:在创建文件的时候,需要同时创建多个文件的方法运行. 根据作业要求,实现一个lilux命令. 根据作业要求添加一个用户loutest,使用sudo创 ...
- IIS项目发布完整流程
第一步: 发布项目 使在IIS上发布是防止源码泄露 第二步: 打开IIS(如果没有就自己安装一个)打开IIS步骤 控制面板>系统安全>管理工具>IIS管理器 填写网站的名称和之前发布 ...
- 《selenium2 python 自动化测试实战》(16)——js操作补充
js修改readonly属性 我们看到这里日期框标签中有readonly属性,如果我们直接send_keys就无法输入内容,这时我们需要先去掉readonly属性: js ='document.get ...