我成功地在子级别(mappedBy
)上维护了多对多的关系,它的工作效果很好,如下所示:
学生实体(所有者)
package com.main.manytomany.models;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;
@Entity
@Table(name = "students")
@Getter
@Setter
@NoArgsConstructor
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@JsonIgnore
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
@JoinTable
(
name = "students_courses",
joinColumns = {
@JoinColumn
(
name = "student_id",
referencedColumnName = "id",
nullable = false,
updatable = false
)
},
inverseJoinColumns = {
@JoinColumn
(
name = "course_id",
referencedColumnName = "id",
nullable = false,
updatable = false
)
}
)
private Set<Course> courses = new HashSet<>();
}
课程实体(子实体)
package com.main.manytomany.models;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;
@Entity
@Table(name = "courses")
@Getter@Setter
@NoArgsConstructor
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToMany(mappedBy = "courses", fetch = FetchType.LAZY)
private Set<Student> students = new HashSet<>();
}
学生服务
package com.main.manytomany.services;
import com.main.manytomany.models.Student;
import com.main.manytomany.repositories.StudentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class StudentService {
private final StudentRepository studentRepository;
@Autowired
public StudentService(StudentRepository studentRepository) {
this.studentRepository = studentRepository;
}
public List<Student> findAll() {
return this.studentRepository.findAll();
}
public Student getOneById(Long id) {
return this.studentRepository.getOne(id);
}
public void store(Student student) {
this.studentRepository.save(student);
}
}
课程服务
package com.main.manytomany.services;
import com.main.manytomany.models.Course;
import com.main.manytomany.models.Student;
import com.main.manytomany.repositories.CourseRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
@Service
public class CourseService {
private final CourseRepository courseRepository;
private final StudentService studentService;
@Autowired
public CourseService(CourseRepository courseRepository, StudentService studentService) {
this.courseRepository = courseRepository;
this.studentService = studentService;
}
public List<Course> findAll() {
return this.courseRepository.findAll();
}
public void store(Course course) {
course.getStudents()
.addAll(course
.getStudents()
.stream()
.map(s -> {
Student student = studentService.getOneById(s.getId());
student.getCourses().add(course);
return student;
}).collect(Collectors.toList()));
this.courseRepository.save(course);
}
}
学生控制器 | 发布映射
@PostMapping
public ResponseEntity<Void> create(@RequestBody Student student) {
this.studentService.store(student);
return new ResponseEntity<>(HttpStatus.CREATED);
}
课程控制器|岗位映射
@PostMapping
public ResponseEntity<Void> create(@RequestBody Course course) {
this.courseService.store(course);
return new ResponseEntity<>(HttpStatus.CREATED);
}
学生列表 | Postman
课程列表 | Postman
学生_课程 | 透视表 + Hibernate 查询
如何在主表中使其工作?
这样,持久性不在CourseService中运行,而应该在StudentService中运行。
这样,我可以在Postman中编写以下内容,同时插入一名学生及其附加的课程:
{
"name" : "John Doe",
"courses" : [
{
"id" : 1
},
{
"id" : 2
}
]
}