Java 引用完整性约束冲突-添加超过2条记录时失败

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

当我加载初始测试数据时,我检索完整性约束冲突异常。只有当我使用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);
    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;