赞
踩
《JPA 从入门到精通》系列包含以下文章:
在 多对多 关联关系中,只能通过 中间表 的方式进行映射,不能通过增加外键来实现。
注解 @ManyToMany 用于关系的发出端和接收端。关系的发出端定义一个集合类型的接收端的字段属性,关系的接收端不需要做任何定义。
package com.example.demo.entity; import lombok.Data; import javax.persistence.*; import java.util.List; import java.util.Set; @Entity @Data public class Student { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; private String name; @Column(columnDefinition = "enum('male','female')") private String sex; @ManyToMany(fetch = FetchType.LAZY) @JoinTable(name = "teacher_student", joinColumns = {@JoinColumn(name = "s_id")}, inverseJoinColumns = {@JoinColumn(name = "t_id")}) private Set<Teacher> teachers; }
package com.example.demo.entity; import lombok.Data; import javax.persistence.*; import java.util.List; import java.util.Set; @Data @Entity public class Teacher { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; private String name; @ManyToMany(fetch = FetchType.LAZY) /** * Description: * 1、关系两边都作为主控; * 2、joinColumns 中 @JoinColumn(name="t_id") 其中 t_id 为 JoinTable 中的外键,由于 Student 和 Teacher 的主键都为 id 这边就省略 referencedColumnName="id"。 */ @JoinTable(name = "teacher_student", joinColumns = {@JoinColumn(name = "t_id")}, inverseJoinColumns = {@JoinColumn(name = "s_id")}) private Set<Student> students; }
在 多对多 关系中需要注意以下几点:
joinColumns
的 @JoinColumn(name="t_id")
中,t_id
为 JoinTable 中的外键。由于 Student 和 Teacher 的主键都为 id
,所以这里省略了 referencedColumnName="id"
。cascade = CascadeType.PERSIST
,则在执行 save
时会调用 onPersist()
方法。这个方法会递归调用外联类(Student 或 Teacher)的 onPersist()
进行级联新增。但因为值已经添加了,所以会报 detached entity passed to persist
错误,将级联操作取消(去掉 cascade = CascadeType.PERSIST
)即可。Service 和 Repository 层在《关系映射开发(一):一对一映射》已经讲过,这里并没有区别,所以不再赘述,直接进入测试层的代码编写。
package com.example.demo.entity; import com.example.demo.repository.StudentRepository; import com.example.demo.repository.TeacherRepository; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.util.HashSet; import java.util.Set; import static org.junit.Assert.*; @SpringBootTest @RunWith(SpringRunner.class) public class ManyToManyTest { @Autowired private StudentRepository studentRepository; @Autowired private TeacherRepository teacherRepository; @Test public void add() { Set<Teacher> teachers = new HashSet<>(); Set<Student> students = new HashSet<>(); Student student1 = new Student(); student1.setName("张三"); students.add(student1); studentRepository.save(student1); Student student2 = new Student(); student2.setName("李四"); students.add(student2); studentRepository.save(student2); Teacher teacher1 = new Teacher(); teacher1.setName("皮皮老师"); teacher1.setStudents(students); teachers.add(teacher1); teacherRepository.save(teacher1); } }
运行测试类,在控制器中输岀如下结果:
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。