2
내 초기 테스트 데이터를로드 할 때 무결성 제약 조건 위반 예외를 검색합니다. addShift 메소드를 사용하여 2 개 이상의 레코드를 추가 할 때만 발생합니다. 메신저 메모리 데이터베이스에서 h2를 사용합니다.참조 무결성 제약 조건 위반 - 2 개 이상의 레코드 추가시 실패
로드 :
public void load() {
shiftService.addShift(1, LocalDate.now(), ShiftType.DAY, 1);
shiftService.addShift(2, LocalDate.now().plusDays(1), ShiftType.NIGHT, 1);
shiftService.addShift(2, LocalDate.now().plusDays(5), ShiftType.NIGHT, 2);
}
시프트 서비스 :
org.h2.jdbc.JdbcSQLException: Referential integrity constraint
violation: "FKG5R8KJRL3GG3EKESMHT77GO7L: PUBLIC.SHIFT FOREIGN KEY(ID)
REFERENCES PUBLIC.GROUPS(ID) (3)"; SQL statement:
insert into shift (id, group_id, shift_date, shift_type) values (null, ?, ?,
?) [23506-196]
모델 :
시프트 :
0,123,516@Transactional
public void addShift(long userId, LocalDate shiftDate, ShiftType shiftType, long groupId) {
Optional<User> user = userService.findOne(userId);
if (user.isPresent()) {
Optional<Group> group = groupService.getOne(groupId);
if (group.isPresent()) {
Shift shift = new Shift(shiftDate, shiftType, group.get());
user.get().addShift(shift);
}
}
}
에 의한
@Entity
public class Shift {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private LocalDate shiftDate;
private ShiftType shiftType;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "user_shifts", joinColumns = @JoinColumn(name = "shift_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"))
private Set<User> users = new HashSet<>();
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "group_id")
private Group group;
그룹 :
@Entity
@Table(name = "groups") // Group is reserved name in SQL
public class Group {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String name;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "user_group", joinColumns = @JoinColumn(name = "group_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"))
private Set<User> users = new HashSet<>();
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "moderator_group", joinColumns = @JoinColumn(name = "group_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"))
private Set<User> moderators = new HashSet<>();
@OneToMany(mappedBy = "id", cascade = CascadeType.ALL)
private Set<Shift> shifts;
사용자 :
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String email;
private String password;
private String firstName;
private String lastName;
private String phone;
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(
name = "user_authority",
joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "authority_name", referencedColumnName = "name")}
)
private Set<Authority> authorities = new HashSet<>();
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(
name = "user_group",
joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "group_id", referencedColumnName = "id")}
)
private Set<Group> usingGroups = new HashSet<>();
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(
name = "moderator_group",
joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "group_id", referencedColumnName = "id")}
)
private Set<Group> moderatingGroups = new HashSet<>();
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(
name = "user_shifts",
joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "shift_id", referencedColumnName = "id")}
)
private Set<Shift> shifts = new HashSet<>();
내가이 예외를 가지고 왜 어떤 아이디어가 있습니까?
id = 2 인 그룹이 데이터베이스에 있습니까? – lzagkaretos
예, 존재하지 않습니다. 저장되지 않습니다 (선택적 체크인 경우). 나는 또한 그룹 1에 교대 만 추가하여 그것을 테스트합니다. 결과는 같습니다. –
@DawidKunert 내가 틀릴 수도 있지만 관계의 양쪽에서'@ JoinTable' /'@ JoinTable '이 필요하다고 생각하지 않습니다. – varren