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属性的总结的更多相关文章

  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. python中sort()与sorted()的区别

    Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列 一,最简单的排序 1.使用sort排序 my_list = [3 ...

  2. Python中的单例设计模式

    1)设计模式: 是前人工作的总结和提炼.通常,被人们广泛流传的设计模式.     某一问题的特定解决方案,使用设计模式是为了可重用代码,是代码更容易被人理解, 增加代码的可用性. 2)单例设计模式: ...

  3. java.sql.SQLException: Unsupported character encoding 'utf8mb4'.

    四月 12, 2017 3:47:52 下午 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.service() fo ...

  4. oracle管道函数的用法

    oracle管道函数是一类特殊的函数,oracle管道函数返回值类型必须为集合,下面将介绍oracle管道函数的语法. 在普通的函数中,使用dbms_output输出的信息,需要在服务器执行完整个函数 ...

  5. XCOde 5 的界面布局一些新特性

    1.问题 •在iOS程序中,大部分视图控制器都包含了大量的代码用于设置UI布局,设置控件的水平或垂直位置,以确保组件在不同版本的iOS中都能得到合理的布局 •甚至有些程序员希望在不同的设备使用相同的视 ...

  6. 51nod 1600 Simple KMP【后缀自动机+LCT】【思维好题】*

    Description 对于一个字符串|S|,我们定义fail[i],表示最大的x使得S[1..x]=S[i-x+1..i],满足(x<i) 显然对于一个字符串,如果我们将每个0<=i&l ...

  7. 不再为命名而苦恼!使用 MSTestEnhancer 单元测试扩展,写契约就够了

    有没有觉得命名太难?有没有觉得单元测试的命名更难?没错,你不是一个人!看看这个你就知道了:程序员最头疼的事:命名 或它的英文原文 Don’t go into programming if you do ...

  8. 出让执行权:Task.Yield, Dispathcer.Yield

    Yield 这个词很有意思,叫做“屈服”“放弃”“让步”,字面意义上是让出当前任务的执行权,转而让其他任务可以插入执行.Task.Dispatcher.Thread 都有 Yield() 方法,看起来 ...

  9. Nginx——安装Nginx(二)

    安装所需环境 Nginx 是 C语言 开发,建议在 Linux 上运行,当然,也可以安装 Windows 版本,本篇则使用 CentOS 7 作为安装环境. gcc 安装 安装 nginx 需要先将官 ...

  10. LeetCode 424. Longest Repeating Character Replacement

    原题链接在这里:https://leetcode.com/problems/longest-repeating-character-replacement/description/ 题目: Given ...