Hibernate无法删除或更新父行:OneToMany中的外键约束失败

时间:2017-03-22 17:07:15

标签: hibernate jpa spring-data-jpa

我有3个类:User,UserFormGroup和FormGroup。 UserFormGroup在User和FormGroup上有一个ManyToOne引用。当我尝试删除FormGroup时,出现以下错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`form`.`user_form_group`, CONSTRAINT `FK_4on68h439dd6w05ikvl7vvvo5` FOREIGN KEY (`form_group_id`) REFERENCES `form_group` (`id`))

` 在FormGroup上,我有以下属性:

@OneToMany(targetEntity=UserFormGroup.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "formGroup", orphanRemoval=true)
private Set<UserFormGroup> userFormGroups = new HashSet<>();

在UserFormGroup上,我有以下属性:

@Id
@ManyToOne
@JoinColumn(referencedColumnName = "id")
private FormGroup formGroup;

当删除FormGroup时,不应该删除orphan_removal = true删除UserFormGroup吗? 它可能来自UserFormGroup和User之间的其他关系吗?如果需要,我可以添加此代码。

修改

以下是我删除FormGroup的方法:

FormGroup group = groupRepository.findByIdAndMember(groupId, user);

if(group == null){
    return  new ResponseEntity<>(HttpStatus.FORBIDDEN);
}

try {
    groupRepository.delete(group);
} catch(IllegalArgumentException e){
    System.out.println(e.getMessage());
    return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
}

我不确定这个技巧是什么,但我认为我必须在每个引用UserFormGroup而不是CascadeType.REMOVE的表上将级联设置为CascadeType.ALL,因为{{1} }包括CascadeType.ALL

1 个答案:

答案 0 :(得分:0)

不是100%肯定,但我想说你需要在FormGroup依赖项上定义一个连接列。

如果没有这个,hibernate将尝试查找formgroup_id并在您的数据库中查找列名为form_group_id

因此,请尝试:

@ManyToOne
@JoinColumn(name = "form_group_id", referencedColumnName = "id")
private FormGroup formGroup;

修改

最重要的是,您需要遍历userFormGroups并将每个条目的FormGroup引用设置为null:

for(UserFormGroup ufg: group.getUserFormGroups()){
      ufg.setFormGroup(null);
 }
 groupRepository.delete(group);