Java 引用完整性约束冲突-添加超过2条记录时失败
当我加载初始测试数据时,我检索完整性约束冲突异常。只有当我使用addShift方法添加超过2条记录时,才会发生这种情况。Im使用h2,内存数据库 装载:Java 引用完整性约束冲突-添加超过2条记录时失败,java,spring,jdbc,spring-data-jpa,h2,Java,Spring,Jdbc,Spring Data Jpa,H2,当我加载初始测试数据时,我检索完整性约束冲突异常。只有当我使用addShift方法添加超过2条记录时,才会发生这种情况。Im使用h2,内存数据库 装载: public void load() { shiftService.addShift(1, LocalDate.now(), ShiftType.DAY, 1); shiftService.addShift(2, LocalDate.now().plusDays(1), ShiftType.NIGHT, 1); shif
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);
}
}
}
型号:
班次:
@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;
@实体
公共阶级转移{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
私有localdateshiftdate;
私有移位类型移位类型;
@多个(级联=级联类型.ALL)
@JoinTable(name=“user\u shifts”,joinColumns=@JoinColumn(name=“shift\u id”,referencedColumnName=“id”),inverseJoinColumns=@JoinColumn(name=“user\u id”,referencedColumnName=“id”))
private Set users=new HashSet();
@多通(级联=级联类型.ALL)
@JoinColumn(name=“group\u id”)
私人集团;
组:
@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;
@实体
@Table(name=“groups”)//组是SQL中的保留名称
公共课组{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
私有字符串名称;
@多个(级联=级联类型.ALL)
@JoinTable(name=“user\u group”,joinColumns=@JoinColumn(name=“group\u id”,referencedColumnName=“id”),inverseJoinColumns=@JoinColumn(name=“user\u id”,referencedColumnName=“id”))
private Set users=new HashSet();
@多个(级联=级联类型.ALL)
@JoinTable(name=“主持人”\u组”,joinColumns=@JoinColumn(name=“组”\u id”,referencedColumnName=“id”),inverseJoinColumns=@JoinColumn(name=“用户id”,referencedColumnName=“id”))
私有集调节器=新HashSet();
@OneToMany(mappedBy=“id”,cascade=CascadeType.ALL)
私人设置转移;
用户:
@实体
公共类用户{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
私人字符串电子邮件;
私有字符串密码;
私有字符串名;
私有字符串lastName;
私人电话;
@ManyToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
@可接合(
name=“user\u authority”,
joinColumns={@JoinColumn(name=“user\u id”,referencedColumnName=“id”)},
inverseJoinColumns={@JoinColumn(name=“authority\u name”,referencedColumnName=“name”)}
)
私有集权限=新HashSet();
@多个(级联=级联类型.ALL)
@可接合(
name=“user\u group”,
joinColumns={@JoinColumn(name=“user\u id”,referencedColumnName=“id”)},
inverseJoinColumns={@JoinColumn(name=“group\u id”,referencedColumnName=“id”)}
)
私有集usingGroups=newhashset();
@多个(级联=级联类型.ALL)
@可接合(
name=“主持人小组”,
joinColumns={@JoinColumn(name=“user\u id”,referencedColumnName=“id”)},
inverseJoinColumns={@JoinColumn(name=“group\u id”,referencedColumnName=“id”)}
)
私有集调节组=新HashSet();
@ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@可接合(
name=“用户”,
joinColumns={@JoinColumn(name=“user\u id”,referencedColumnName=“id”)},
inverseJoinColumns={@JoinColumn(name=“shift\u id”,referencedColumnName=“id”)}
)
私有集移位=新HashSet();
你知道我为什么会出现这个异常吗?你在
组中的映射是错误的
@OneToMany(mappedBy = "id", cascade = CascadeType.ALL)
private Set<Shift> shifts;
@OneToMany(mappedBy=“id”,cascade=CascadeType.ALL)
私人设置转移;
这应该是:
@OneToMany(mappedBy = "group", cascade = CascadeType.ALL)
private Set<Shift> shifts;
@OneToMany(mappedBy=“group”,cascade=CascadeType.ALL)
私人设置转移;
说明:
Hibernate正在shift
中的id
和group
中的id
之间添加外键约束。您可能正在添加两个组,并且在尝试添加两个以上的班次后,该约束未得到满足,因为id为3的组不存在。数据库中存在id=2的组?是的,它存在,o否则它将不会被保存(如果需要,可选择签入)。我还通过只向组1添加移位来测试它。结果是一样的。@DawidKunert我可能错了,但我认为您不需要从关系的两侧都使用@JoinTable
/@JoinTable
。@varren据我所知,这是推荐的解决方案,但我认为这与此无关,因为例外情况是说em在位移和位移之间有许多关系Group@DawidKunert是的,但我仍然会检查它,它有类似的问题,有完全不相关的双边联接异常,顺便说一句,它也适用于关联的拥有方。
@OneToMany(mappedBy = "id", cascade = CascadeType.ALL)
private Set<Shift> shifts;
@OneToMany(mappedBy = "group", cascade = CascadeType.ALL)
private Set<Shift> shifts;