jpa 如何删除注解了多对多关系实体

e4yzc0pl  于 2024-01-08  发布在  其他
关注(0)|答案(2)|浏览(160)

我已经做了3个多小时了,没有进展。我有这个方法:

  1. public String deleteShift(Shifts shifts){
  2. Shifts shiftToBeDeleted = shiftsRepository.findById(shifts.getId()).orElseThrow(() ->new ShiftNotFoundException("This shift doesn't exist"));
  3. Set<Staff> staffListForShift = shiftToBeDeleted.getStaff();
  4. if (shiftToBeDeleted.getStaff().isEmpty()){
  5. System.out.println("this fucker:" + shiftToBeDeleted.getStaff());
  6. shiftsRepository.deleteById(shifts.getId());
  7. return "Shift removed.";
  8. }else {
  9. for (Staff staff : shiftToBeDeleted.getStaff()){
  10. System.out.println("this fucker is second:"+ staff.getUsername());
  11. staff.getShifts().remove(shiftToBeDeleted);
  12. staffRepository.save(staff);
  13. }
  14. shiftsRepository.deleteById(shiftToBeDeleted.getId());
  15. return "Shift removed, assign the free staff to a different one.";
  16. }
  17. }

字符串
它应该删除一个移位,但它不断返回一个违反外键约束的,我不能为我的生活修复。
这是轮班课程

  1. public class Shifts {
  2. @Id
  3. @GeneratedValue(strategy = GenerationType.SEQUENCE)
  4. private Long id;
  5. @Temporal(TemporalType.TIME)
  6. private LocalTime shiftStart;
  7. @Temporal(TemporalType.TIME)
  8. private LocalTime shiftEnd;
  9. @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
  10. @JsonIgnore
  11. private Set<Staff> staff;}


这是staff类:

  1. public class Staff {
  2. @Id
  3. private Long id;
  4. private String username;
  5. private String password;
  6. @Enumerated(EnumType.STRING)
  7. private StaffStates state;
  8. @Enumerated(EnumType.STRING)
  9. private UserTypes type;
  10. @OneToOne( cascade = CascadeType.ALL)
  11. @MapsId
  12. @JoinColumn(name = "id")
  13. private User user;
  14. @OneToMany(cascade = CascadeType.ALL)
  15. @JoinColumn(name = "staff")
  16. private Set<WorkHours> workHoursSet;
  17. @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
  18. @JoinTable(
  19. name = "StaffShifts",
  20. joinColumns = @JoinColumn(name = "staffId"),
  21. inverseJoinColumns = @JoinColumn(name = "shiftId"))
  22. private Set<Shifts> shifts;
  23. @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
  24. @JoinTable(
  25. name = "StaffPermissions",
  26. joinColumns = @JoinColumn(name = "staffid"),
  27. inverseJoinColumns = @JoinColumn(name = "permissionId"))
  28. private Set<Permissions> permissions;
  29. @OneToMany()
  30. private Set<Transactions> transactionsSet;


}
我尝试使用cascade来解决这个问题,但根据this,不建议删除cascade
编辑:错误在getStaff.isEMpty()中。不知何故,检查中的人员列表弹出为空,但当我从中删除时,它抛出了一个违反外键的异常。

nnt7mjpx

nnt7mjpx1#

要在hibernate中删除多对多的关系,你需要删除彼此之间的 BOTH sides/entites。
在这部分代码中,你获取staff实体并删除shift。但你还需要获取shifts实体并从中删除staff:

  1. shiftToBeDeleted.getStaff().clear(); //SOMETHING LIKE THAT
  2. for (Staff staff : shiftToBeDeleted.getStaff()){
  3. System.out.println("this fucker is second:"+ staff.getUsername());
  4. staff.getShifts().remove(shiftToBeDeleted);
  5. shiftToBeDeleted.getStaff().remove(staff); //SOMETHING LIKE THAT
  6. staffRepository.save(staff);
  7. }

字符串
我还可以想象,你需要改变级联,也增加了一个:

  1. cascade = {CascadeType.ALL}

展开查看全部
gz5pxeao

gz5pxeao2#

由于没有找到解决方案,我实际上创建了staff_shifts实体并Map它,这没有问题。

相关问题