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

e4yzc0pl  于 5个月前  发布在  其他
关注(0)|答案(2)|浏览(70)

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

public String deleteShift(Shifts shifts){

     Shifts shiftToBeDeleted = shiftsRepository.findById(shifts.getId()).orElseThrow(() ->new ShiftNotFoundException("This shift doesn't exist"));
           Set<Staff> staffListForShift = shiftToBeDeleted.getStaff();

  if (shiftToBeDeleted.getStaff().isEmpty()){

         System.out.println("this fucker:" + shiftToBeDeleted.getStaff());
         shiftsRepository.deleteById(shifts.getId());
         return "Shift removed.";
     }else {
         for (Staff staff : shiftToBeDeleted.getStaff()){
             System.out.println("this fucker is second:"+ staff.getUsername());
             staff.getShifts().remove(shiftToBeDeleted);
             staffRepository.save(staff);
         }
         shiftsRepository.deleteById(shiftToBeDeleted.getId());
         return "Shift removed, assign the free staff to a different one.";
     }
}

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

public class Shifts {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
@Temporal(TemporalType.TIME)
private LocalTime shiftStart;
@Temporal(TemporalType.TIME)
private LocalTime shiftEnd;
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
@JsonIgnore
private Set<Staff> staff;}


这是staff类:

public class Staff {
@Id
private Long id;
private String username;
private String password;
@Enumerated(EnumType.STRING)
private StaffStates state;
@Enumerated(EnumType.STRING)
private UserTypes type;

@OneToOne( cascade = CascadeType.ALL)
@MapsId
@JoinColumn(name = "id")
private User user;

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "staff")
private Set<WorkHours> workHoursSet;

@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
@JoinTable(
        name = "StaffShifts",
        joinColumns = @JoinColumn(name = "staffId"),
        inverseJoinColumns = @JoinColumn(name = "shiftId"))
private Set<Shifts> shifts;

@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
@JoinTable(
        name = "StaffPermissions",
        joinColumns = @JoinColumn(name = "staffid"),
        inverseJoinColumns = @JoinColumn(name = "permissionId"))
        private Set<Permissions> permissions;

@OneToMany()
private Set<Transactions> transactionsSet;


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

nnt7mjpx

nnt7mjpx1#

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

shiftToBeDeleted.getStaff().clear(); //SOMETHING LIKE THAT

for (Staff staff : shiftToBeDeleted.getStaff()){
     System.out.println("this fucker is second:"+ staff.getUsername());
     staff.getShifts().remove(shiftToBeDeleted);
     shiftToBeDeleted.getStaff().remove(staff); //SOMETHING LIKE THAT
     staffRepository.save(staff);
 }

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

cascade = {CascadeType.ALL}

gz5pxeao

gz5pxeao2#

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

相关问题