2017-10-20 45 views
0

J'ai 2 entités comme celui-ci:Hibernate supprimer douce ensembles clé étrangère null

@SQLDelete(sql = "UPDATE parent_table SET deleted = true WHERE id = ?") 
public class Parent { 
private boolean deleted; 

@OneToMany(cascade = CascadeType.ALL) 
@JoinColumn(name = "parent_id") 
private List<Child> children; 

// other stuff 
} 

@SQLDelete(sql = "UPDATE child_table SET deleted = true WHERE id = ?") 
public class Child { 
private boolean deleted; 
// stuff 
} 

Comme vous pouvez le voir, est un mappage de @OneToMany unidirectionnel et les deux entités utilisent supprimer doux avec l'annotation @SQLDelete. J'essaye de supprimer le parent et de le supprimer à son tour. Lorsque j'essaie de supprimer en douceur, il définit l'indicateur deleted sur true dans les deux tables et c'est ce que je veux.
Toutefois, le parent_id dans child_table est défini sur null lorsque j'effectue la suppression. Pourquoi cela se passe-t-il et comment puis-je arrêter cela?

L'opération de suppression:

Parent parent= entityManager.find(Parent.class, id); 
entityManager.remove(parent); 
+0

Le parent est en cours de suppression, comme il devrait l'être non? Recherchez la suppression en cascade. –

+0

L'indicateur de suppression est défini et c'est exactement ce que je veux. Mais hibernate détruit également la relation parent-enfant en plaçant la clé étrangère dans 'child_table' à' null'. – Neeraj

+0

La destruction de la relation parent-enfant lors de la cascade de l'opération de suppression du parent vers des enfants privés est logique et Hibernate ne sait pas (ou ne se soucie pas) de ce que fait la requête de '@ SQLDelete'. Pour cette raison, je soupçonne fortement que ce que vous demandez est impossible. – crizzis

Répondre

0

Je ne sais pas si ce que vous voulez est possible, mais vous pouvez essayer d'ajouter ceci à votre cartographie:

@OnDelete(action = OnDeleteAction.NO_ACTION) 

Peut-être que cette Hibernate a gagné » t changer la relation.

0

Pour contourner le problème, vous pouvez désactiver la suppression en cascade et supprimer manuellement les enfants.