简体   繁体   English

参照完整性约束违规 - 添加超过2条记录时失败

[英]Referential integrity constraint violation - failing when add more then 2 records

When im loading my initial tests data i retrieve integrity constraint violation exception. 当我加载我的初始测试数据时,我检索完整性约束违规异常。 It only occurs, when im adding more then 2 records, using addShift method. 只有当我使用addShift方法添加2条以上的记录时才会发生这种情况。 Im using h2, in memory database. 我在内存数据库中使用h2。

Loading: 加载:

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);
}

Shift Service: 轮班服务:

@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);
        }
    }
}

Caused by: 引起:

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]

Model: 模型:

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;

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;

User: 用户:

@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<>();

Do you have any ideas why i got this exception? 你有什么想法我得到这个例外吗?

Your mapping in Group is wrong. 您在Group映射是错误的。

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

This should be rather: 这应该是:

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

Explanation: 说明:

Hibernate is adding a foreign key constraint between id in shift and id in group . Hibernate是增加之间的外键约束idshiftidgroup You are probably adding 2 groups, and after you try to add more than 2 shifts, the constraint isn't fulfilled, because a group with id 3 doesn't exist. 您可能正在添加2个组,并且在尝试添加2个以上的班次后,未满足约束,因为不存在ID为3的组。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 H2参照完整性约束违反 - H2 Referential integrity constraint violation 无继承关系的参照完整性约束违规 - Referential integrity constraint violation for none inheritance relationship 如何防止在测试中违反参照完整性约束? - How to prevent referential integrity constraint violation in tests? 当删除带有播放框架2.2.x的对象时,违反引用完整性约束 - Referential integrity constraint violation when deleting an object with play-framework 2.2.x SQl 错误 - 一次持久化多个实体时违反参照完整性约束 - SQl error - Referential integrity constraint violation when persisting several entities at once 违反参照完整性约束:删除 Hibernate 中的实体时(memory DBMS 中的 H2) - Referential integrity constraint violation: when deleting Entity in Hibernate (H2 in memory DBMS) 所有者删除时违反参照完整性约束(OneToMany单向) - Referential integrity constraint violation on owner delete (OneToMany unidirectional) Hibernate / H2 @OneToMany移除子代时违反“参照完整性约束”? - Hibernate/H2 @OneToMany “Referential integrity constraint violation” on remove of child? 更新和/或删除时违反 Hibernate H2 参照完整性约束 - Hibernate H2 Referential Integrity Constraint Violation on Update and/or Remove Spring 引导 - 测试存储库 - 违反参照完整性约束 - Spring Boot - testing repository - Referential integrity constraint violation
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM