一 代码位置
https://gitee.com/cakin24/code/tree/master/08/JpaManyToManyDemo
二 关键代码
1 Student
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;
}
2 Teacher
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;
}
3 测试代码
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;
@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("zhonghua");
students.add(student1);
studentRepository.save(student1);
Student student2 = new Student();
student2.setName("zhiran");
students.add(student2);
studentRepository.save(student2);
Teacher teacher1 =new Teacher();
teacher1.setName("龙老师");
teacher1.setStudents(students);
teachers.add(teacher1);
teacherRepository.save(teacher1);
}
}
三 测试结果
1 控制台输出
Hibernate: insert into student (name, sex) values (?, ?)
Hibernate: insert into student (name, sex) values (?, ?)
Hibernate: insert into teacher (name) values (?)
Hibernate: insert into teacher_student (t_id, s_id) values (?, ?)
Hibernate: insert into teacher_student (t_id, s_id) values (?, ?)
2 数据库输出