gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:33:50 25 4
gpt4 key购买 nike

当我加载我的初始测试数据时,我检索到违反完整性约束的异常。它只发生在我使用 addShift 方法添加超过 2 条记录时。我在内存数据库中使用 h2。

正在加载:

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

轮类服务:

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

原因:

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]

型号:

类次:

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

你知道为什么我会得到这个异常吗?

最佳答案

您在 Group 中的映射是错误的。

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

这应该是:

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

解释:

Hibernate 在 shift 中的 idgroup 中的 id 之间添加外键约束。您可能正在添加 2 个组,并且在您尝试添加超过 2 个类次后,约束未满足,因为 ID 为 3 的组不存在。

关于java - 违反参照完整性约束 - 添加超过 2 条记录时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47606003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com