2017-12-02 15 views
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<>(); 

내가이 예외를 가지고 왜 어떤 아이디어가 있습니까?

+0

id = 2 인 그룹이 데이터베이스에 있습니까? – lzagkaretos

+0

예, 존재하지 않습니다. 저장되지 않습니다 (선택적 체크인 경우). 나는 또한 그룹 1에 교대 만 추가하여 그것을 테스트합니다. 결과는 같습니다. –

+0

@DawidKunert 내가 틀릴 수도 있지만 관계의 양쪽에서'@ JoinTable' /'@ JoinTable '이 필요하다고 생각하지 않습니다. – varren

답변

2

Group에 매핑이 잘못되었습니다.

@OneToMany(mappedBy = "id", cascade = CascadeType.ALL) 
private Set<Shift> shifts; 

이 오히려되어야합니다 :

@OneToMany(mappedBy = "group", cascade = CascadeType.ALL) 
private Set<Shift> shifts; 

설명 : Hibernate는 groupshiftidid 사이에 외래 키 제약 조건을 추가

. 아마도 2 개의 그룹을 추가하고 있고 2 개 이상의 시프트를 추가하려고하면 id 3을 가진 그룹이 없기 때문에 제약 조건이 충족되지 않습니다.