我已经做了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()中。不知何故,检查中的人员列表弹出为空,但当我从中删除时,它抛出了一个违反外键的异常。
2条答案
按热度按时间nnt7mjpx1#
要在hibernate中删除多对多的关系,你需要删除彼此之间的 BOTH sides/entites。
在这部分代码中,你获取staff实体并删除shift。但你还需要获取shifts实体并从中删除staff:
字符串
我还可以想象,你需要改变级联,也增加了一个:
型
gz5pxeao2#
由于没有找到解决方案,我实际上创建了staff_shifts实体并Map它,这没有问题。