mappedBy:

所填内容必为本类在另一方的字段名。

表示:本类放弃控制关联关系,所有对关联关系的控制,如:建立、解除与另一方的关系,都由对方控制,本类不管。举个例子:

Teacher和Student之间是多对多关联关系,在Student端的teachers字段的@ManyToMany注解里面,配置属性mappedBy = "students"。表示:学生没有资格控制与老师的关联关系(如:建立关系、删除关系),只有老师才有资格控制关联关系。学生不能说:”我们两做朋友吧“。(即使说了,也无济于事,老师当学生没说。即Hibernate把学生说的当作耳边风,虽然Hibernate也不会抛出异常,程序照样能运行)。但是,老师可以说,“我们做朋友吧”。那么,学生只能无任何拒绝理由地接受。同样,如果学生说,”我们从此一刀两断吧“,那也是没用的。只有老师说:“滚,有多远,滚多远,为师今日将你逐出师门,再也不想见到你”,那么,这才能有效地解除关联关系(注意:这是一个对象(对应数据库里的一行记录)和一个对象之间的关系,而不是表和表之间的关联关系。一对师生关系的解除,不能影响整个社会的师生关系)。

测试代码:(这是完整类,后面只贴出test1的代码,其他部分不变)

  1. public class MappedByTest {
  2.  
  3. private static SessionFactory sessionFactory;
  4.  
  5. private Session session;
  6.  
  7. @BeforeClass
  8. public static void beforeTest(){
  9. sessionFactory = HibernateUtil.getSessionFactory();
  10. }
  11. @AfterClass
  12. public static void afterTest(){
  13. sessionFactory.close();
  14. }
  15. @Before
  16. public void beginTransaction(){
  17. session = sessionFactory.openSession();
  18. session.beginTransaction();
  19. }
  20. @After
  21. public void commitTransaction(){
  22. session.getTransaction().commit();
  23. session.close();
  24. }
  25.  
  26. @Test
  27. public void execute(){
  28. test1();
  29. }
  30.  
  31. public void test1(){
  32. Student student1 = new Student("学生张三",3);
  33. Student student2 = new Student("学生李四",4);
  34. Teacher teacher1 = new Teacher("老师王五",5);
  35. Teacher teacher2 = new Teacher("老师赵六",6);
  36.  
  37. List<Student> students = new ArrayList<>();
  38. students.add(student1);
  39. students.add(student2);
  40. List<Teacher> teachers = new ArrayList<>();
  41. teachers.add(teacher1);
  42. teachers.add(teacher2);
  43.  
  44. session.save(teacher1);
  45. session.save(teacher2);
  46. student1.setTeachers(teachers);
  47. session.save(student1);
  48. }
  49. }

产生的结果:

----------------------------------------------------------------------------------------

然后,清空数据库,做第二次测试:

  1. public void test1() {
  2. Student student1 = new Student("学生张三", 3);
  3. Student student2 = new Student("学生李四", 4);
  4. Teacher teacher1 = new Teacher("老师王五", 5);
  5. Teacher teacher2 = new Teacher("老师赵六", 6);
  6.  
  7. List<Student> students = new ArrayList<>();
  8. students.add(student1);
  9. students.add(student2);
  10. List<Teacher> teachers = new ArrayList<>();
  11. teachers.add(teacher1);
  12. teachers.add(teacher2);
  13.  
  14. session.save(student1);
  15. session.save(student2);
  16. teacher1.setStudents(students);
  17. session.save(teacher1);
  18. }

产生的结果:

可见:在Student类的teachers字段的@ManyToMany注解上配置属性mappedBy = "students",所有Student类产生的对象均不能建立和老师的关联关系,只有老师可以。

----------------------------------------------------------------------------------------

然后,清空数据库,做第三次测试:

  1. public void test1(){
  2. Student student1 = new Student("学生张三",3);
  3. Student student2 = new Student("学生李四",4);
  4. Teacher teacher1 = new Teacher("老师王五",5);
  5. Teacher teacher2 = new Teacher("老师赵六",6);
  6.  
  7. List<Student> students = new ArrayList<>();
  8. students.add(student1);
  9. students.add(student2);
  10. List<Teacher> teachers = new ArrayList<>();
  11. teachers.add(teacher1);
  12. teachers.add(teacher2);
  13.  
  14. int stuId = 4;
  15. int teacherId = 6;
  16. Student persistentStudent = (Student)session.get(Student.class, stuId);
  17. Teacher persistentTeacher = (Teacher)session.get(Teacher.class, teacherId);
  18. persistentStudent.getTeachers().remove(persistentTeacher);
  19. session.update(persistentStudent);
  20. }

控制台打出的SQL语句:

  1. Hibernate:
  2. select
  3. student0_.student_id as student_1_0_0_,
  4. student0_.age as age2_0_0_,
  5. student0_.name as name3_0_0_
  6. from
  7. student student0_
  8. where
  9. student0_.student_id=?
  10. Hibernate:
  11. select
  12. teacher0_.teacher_id as teacher_1_1_0_,
  13. teacher0_.age as age2_1_0_,
  14. teacher0_.name as name3_1_0_
  15. from
  16. teacher teacher0_
  17. where
  18. teacher0_.teacher_id=?
  19. Hibernate:
  20. select
  21. teachers0_.student_id as student_2_2_0_,
  22. teachers0_.teacher_id as teacher_1_2_0_,
  23. teacher1_.teacher_id as teacher_1_1_1_,
  24. teacher1_.age as age2_1_1_,
  25. teacher1_.name as name3_1_1_
  26. from
  27. ts_relation teachers0_
  28. inner join
  29. teacher teacher1_
  30. on teachers0_.teacher_id=teacher1_.teacher_id
  31. where
  32. teachers0_.student_id=?

产生的结果:

----------------------------------------------------------------------------------------

然后,清空数据库,做第四次测试:

  1. public void test1(){
  2. Student student1 = new Student("学生张三",3);
  3. Student student2 = new Student("学生李四",4);
  4. Teacher teacher1 = new Teacher("老师王五",5);
  5. Teacher teacher2 = new Teacher("老师赵六",6);
  6.  
  7. List<Student> students = new ArrayList<>();
  8. students.add(student1);
  9. students.add(student2);
  10. List<Teacher> teachers = new ArrayList<>();
  11. teachers.add(teacher1);
  12. teachers.add(teacher2);
  13.  
  14. int stuId = 4;
  15. int teacherId = 6;
  16. Student persistentStudent = (Student)session.get(Student.class, stuId);
  17. Teacher persistentTeacher = (Teacher)session.get(Teacher.class, teacherId);
  18. persistentTeacher.getStudents().remove(persistentStudent);
  19. session.update(persistentTeacher);
  20. }

控制台打出的SQL语句:

  1. Hibernate:
  2. select
  3. student0_.student_id as student_1_0_0_,
  4. student0_.age as age2_0_0_,
  5. student0_.name as name3_0_0_
  6. from
  7. student student0_
  8. where
  9. student0_.student_id=?
  10. Hibernate:
  11. select
  12. teacher0_.teacher_id as teacher_1_1_0_,
  13. teacher0_.age as age2_1_0_,
  14. teacher0_.name as name3_1_0_
  15. from
  16. teacher teacher0_
  17. where
  18. teacher0_.teacher_id=?
  19. Hibernate:
  20. select
  21. students0_.teacher_id as teacher_1_2_0_,
  22. students0_.student_id as student_2_2_0_,
  23. student1_.student_id as student_1_0_1_,
  24. student1_.age as age2_0_1_,
  25. student1_.name as name3_0_1_
  26. from
  27. ts_relation students0_
  28. inner join
  29. student student1_
  30. on students0_.student_id=student1_.student_id
  31. where
  32. students0_.teacher_id=?
  33. Hibernate: --------------------------注意这条
  34. delete
  35. from
  36. ts_relation
  37. where
  38. teacher_id=?
  39. Hibernate:
  40. insert
  41. into
  42. ts_relation
  43. (teacher_id, student_id)
  44. values
  45. (?, ?)

产生的结果:

可见:在Student类的teachers字段的@ManyToMany注解上配置属性mappedBy = "students",所有Student类产生的对象均不能删除和老师的关联关系,只有老师可以。

----------------------------------------------------------------------------------------

由此证明了之前所说的,mappedBy表示,本类防止控制和另一方的关联关系,所填内容必为本类在另一方的字段名。

注意:mappedBy和@JoinTable是互斥的,也就是说,@"关联关系注解"里面写了mappedBy属性,下面就不能再写@JoinTable。否则,Hibernate报异常。

Hibernate 一对一、一对多、多对多注解mappedBy属性的总结的更多相关文章

  1. JPA级联(一对一 一对多 多对多)注解【实际项目中摘取的】并非自己实际应用

    下面把项目中的用户类中有个:一对一  一对多  多对多的注解对应关系列取出来用于学习      说明:项目运行正常 问题类:一对多.一对一.多对多 ============一对多 一方的设置 @One ...

  2. Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作

    Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: ​ ​ ​  ​ ​ 由于如果只使用一张表存储所有的数据,就会操作数 ...

  3. mybatis 一对一 一对多 多对多

    一对一 一对多 多对多

  4. hibernate 双向一对多关系(Annotation mappedBy注解理解)

    1.@mappedBy 属性简单理解为设定为主表(OneToMany方)(这只是我个人理解,上面文章中也有提到过) 所以另一端(ManyToOne)则需要设置外键@JoinColumn(name=&q ...

  5. JPA 一对一 一对多 多对一 多对多配置

    1 JPA概述 1.1 JPA是什么 JPA (Java Persistence API) Java持久化API.是一套Sun公司 Java官方制定的ORM 方案,是规范,是标准 ,sun公司自己并没 ...

  6. 使用NHibernate(7)-- 一对一 && 一对多 && 多对多

    1, 一对一. 对于数据量比较大的时候,考虑查询的性能,肯能会把一个对象的属性分到两个表中存放:比如用户和用户资料,经常使用的一般是Id和用户名,用户资料(学校,籍贯等)是不经常被查询的,所以就会分成 ...

  7. day 69-70 一对一 一对多 多对一联表查询

    day 69 orm操作之表关系,多对多,多对一 多对一/一对多, 多对多{类中的定义方法} day69 1. 昨日内容回顾 1. 单表增删改查 2. 单表查询API 返回QuerySet对象的: 1 ...

  8. 2018.11.4 Hibernate中一对、多对多的关系

    简单总结一下 多表关系 一对多/多对一 O 对象 一的一方使用集合. 多的一方直接引用一的一方. R 关系型数据库 多的一方使用外键引用一的一方主键. M 映射文件 一: 多: 操作: 操作管理级别属 ...

  9. Hibernate 一对一、一对多、多对多注解cascade属性的总结

    作用:是否级联被注解字段里面的对象.可选值:javax.persistence.CascadeType.PERSIST, MERGE, REMOVE, REFRESH, DETACH, ALL.可选其 ...

随机推荐

  1. c# DataTable 导出csv文件

    using System; using System.Data; using System.Configuration; using System.Collections.Generic; using ...

  2. 当创建SDL工程发现“无法解析的外部符号 _SDL_main”出错

    当你创建一个新控制台程序,想调用SDL时,编译时发现如下出错: 1>------ 已启动生成: 项目: caipal, 配置: Debug Win32 ------1>  caipal.c ...

  3. Jmter操作数据库

    1.导入jdbc的jar包,因为jmeter本身不能直接连接mysql,所以需要导入第三方的jar包,来连接mysql,如下操作: 2.创建数据库连接如下: 3.配置mysql的url.端口号.账号. ...

  4. ssm框架实现图片上传显示并保存地址到数据库

    本案例是通过springmvc+spring+mybatis框架以商品上传为例,实现的图片上传功能,并把图片的地址保存到数据库并在前台显示上传的图片. 本项目是使用maven搭建的项目,首先看下项目结 ...

  5. scrapy爬取验证码登录网页

    scrapy 验证码登录程序, https://accounts.douban.com/login # -*- coding: utf-8 -*- import scrapy import urlli ...

  6. dockerize 容器工具集基本使用

    基本功能:   *  在启动的时候根据环境变量或者模版生成配置文锦啊 *   多日志文件重定向到标准输入输出 *   等待其他服务(tcp,http unix)起来之后在启动主进程   1. 安装 直 ...

  7. MVC之前的那点事儿 ---- 系列文章

    MVC之前的那点事儿系列,是笔者在2012年初阅读MVC3源码的时候整理的,主要讲述的是从HTTP请求道进入MVCHandler之前的内容,包括了原创,翻译,转载,整理等各类型文章,当然也参考了博客园 ...

  8. 在window上使用eclipse对hadoop进行编程

    步骤: 1.下载hadoop-eclipse-plugin-1.2.1.jar 2.把 hadoop-eclipse-plugin-1.2.1.jar"放到Eclipse的目录的" ...

  9. hdu 1724 Ellipse——辛普森积分

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1724 #include<cstdio> #include<cstring> #in ...

  10. jdk1.8新特性之接口default方法

    众所周知,default是java的关键字之一,使用场景是配合switch关键字用于条件分支的默认项.但自从java的jdk1.8横空出世以后,它就被赋予了另一项很酷的能力——在接口中定义非抽象方法. ...