2017-03-22 2 views
0

私は3つのクラスUser、UserFormGroup、FormGroupを持っています。 UserFormGroupには、UserおよびFormGroupのManyToOne参照があります。私はFormGroupを削除しようとすると、私は次のエラーを取得:FormGroupオンHibernate親行を削除または更新できません:OneToManyで外部キー制約が失敗します

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`)) 

` を私は次の属性があります

@Id 
@ManyToOne 
@JoinColumn(referencedColumnName = "id") 
private FormGroup formGroup; 
:UserFormGroupオン

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

を私は次の属性を持っています

FormGroupが削除されたときにorphan_removal = trueを削除してUserFormGroupを削除しないでください。 UserFormGroupとUserの間の他の関係から来るのでしょうか?必要に応じてこのコードを追加することができます。


EDITここ

私は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(); 
} 

SOLUTION

私はトリックをしたかわからないんだけど、私は設定する必要があったと思うCascadeType.ALLにはCascadeType.PERSISTが含まれているため、CascadeType.ALLの代わりにUserFormGroupを参照していたすべてのテーブルで、CascadeType.REMOVEにカスケードします。

+0

削除方法を追加 –

+0

私はそれを追加しました。私はSpring DataでCrudRepositoryを拡張するDAOを使用します。 – Servietsky

答えて

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); 
+0

それは動作していないようです。 – Servietsky

+0

私の更新を確認しよう –

+0

グループが削除されたときにUserFormGroupsを削除したいのですが、forの中で 'userFormGroupRepository.delete(ufg);'を使うべきですか? – Servietsky

関連する問題