我有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
。
答案 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);