Spring Boot 在JPA中删除引用记录时删除关联表记录

nwlls2ji  于 2023-10-16  发布在  Spring
关注(0)|答案(1)|浏览(162)

我有一个表student和一个表course,它们被一个关联表student_course引用。这就是实体的样子

  1. @Entity
  2. public class Student {
  3. @Id
  4. @GeneratedValue(generator = "UUID")
  5. @GenericGenerator(
  6. name = "id",
  7. strategy = "com.something.UUIDGenerator"
  8. )
  9. private UUID id;
  10. @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
  11. @JoinTable(
  12. name = "student_course",
  13. joinColumns = @JoinColumn(name = "student_id"),
  14. inverseJoinColumns = @JoinColumn(name = "course_id")
  15. )
  16. private List<Course> courses;
  17. @OneToMany(mappedBy = "student")
  18. @OrderBy("sequenceNumber ASC")
  19. private List<StudentCourse> studentCourses;
  20. }
  21. @Entity
  22. public class Course {
  23. @Id
  24. @GeneratedValue(generator = "UUID")
  25. @GenericGenerator(
  26. name = "id",
  27. strategy = "com.something.UUIDGenerator"
  28. )
  29. private UUID id;
  30. @ManyToMany(mappedBy = "students")
  31. private List<Student> students;
  32. @OneToMany(mappedBy = "course")
  33. @OrderBy("sequenceNumber ASC")
  34. private List<StudentCourses> studentCourses;
  35. }
  36. @Entity
  37. public class StudentCourse {
  38. @EmbeddedId
  39. private StudentCourseId studentCourseId;
  40. @ManyToOne
  41. @MapsId("studentId")
  42. @JoinColumn(name = "student_id")
  43. private Student student;
  44. @ManyToOne
  45. @MapsId("courseId")
  46. @JoinColumn(name = "course_id")
  47. private Course course;
  48. private Long sequenceNumber;
  49. }
  50. @Embeddable
  51. public class StudentCourseId implements Serializable {
  52. private UUID studentId;
  53. private UUID courseId;
  54. }

我对表没有级联约束,我尝试用查询从student中删除记录,但在student_course中引用的记录没有删除。如果我使用StudentRepository的deleteById,那么在student_course中引用它们的记录也会被删除。我不想那样,我想处理删除。

  1. @Repository
  2. public interface StudentRepository extends CrudRepository<Student, UUID> {
  3. }

你知道为什么会这样吗我不希望删除这两个表的记录时发生级联。
我正在使用PostgreSQL和spring-boot-starter-parent的2.3.3.RELEASE。

hmtdttj4

hmtdttj41#

您已经在学生和课程实体之间建立了多对多关系。请考虑删除一对多关系,也没有必要创建一个StudentCourse实体,Hibernate将检测您的student_course表。让我们考虑客户和产品之间的多对多Map。
@ManyToMany(mappedBy =“customers”)私有列表产品;
@ManyToMany @JoinTable(name =“customer_product”,joinColumns = @JoinColumn(name =“product_id”),inverseJoinColumns = @JoinColumn(name =“customer_id”))私有列表客户;
在这里,客户是关系的拥有方。

相关问题