2017-03-22 4 views
0

J'ai 3 classes: User, UserFormGroup et FormGroup. UserFormGroup a une référence ManyToOne sur User et FormGroup. Lorsque je tente de supprimer un FormGroup, je reçois l'erreur suivante:Hibernate Impossible de supprimer ou mettre à jour une ligne parente: une contrainte de clé étrangère échoue dans 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`)) 

` Sur FormGroup je l'attribut suivant:

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

Sur UserFormGroup je l'attribut suivant:

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

Shouldphan_removal = true Supprimer remove UserFormGroup lorsque FormGroup est supprimé? Pourrait-il provenir de l'autre relation entre UserFormGroup et User? Je peux ajouter ce code si nécessaire.


EDIT

Voici comment je supprimer le 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

Je ne sais pas ce qui a fait l'affaire, mais Je pense que je devais mettre la cascade à CascadeType.REMOVE sur chaque table référençant UserFormGroup au lieu de CascadeType.ALL car CascadeType.ALL inclut CascadeType.PERSIST.

+0

ajouter la méthode de suppression –

+0

Je viens de l'ajouter. J'utilise un DAO qui étend CrudRepository avec Spring Data. – Servietsky

Répondre

0

Pas sûr à 100%, mais je dirais que vous devez définir une colonne de jointure sur la dépendance FormGroup.

Sans cela, Hibernate va chercher formgroup_id et sur votre base de données ce nom de colonne est: form_group_id.

donc avoir que dit essayer de:

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

Modifier

En plus de cela, vous devez parcourir la userFormGroups et définie sur null la référence au FormGroup pour chacun des les entrées:

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

Il ne semble pas fonctionner – Servietsky

+0

essayer de vérifier ma mise à jour –

+0

Je veux supprimer les UserFormGroups lorsque le groupe est supprimé, devrais-je utiliser 'userFormGroupRepository.delete (ufg);' dans le? – Servietsky