2017-10-07 4 views
0

Je suis en train de mettre en œuvre-suppression douce en utilisant l'annotation Hibernate avec les entités suivantes:Hibernate suppression douce avec les jeux en cascade FK NULL

@MappedSuperclass 
public abstract class AbstractEntity implements Serializable { 
    ... 
@Column(name = "DELETED") 
protected boolean deleted = false; 
    ... 
} 

@Entity 
@Table(name = "TARGET") 
@Where(clause = "deleted = '0'") 
@SQLDelete(sql = "UPDATE target SET deleted = '1'") 
public class Target extends AbstractEntity { 
    ... 
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
@JoinColumn(name = "TARGET_ID") 
private Set<Recording> recordings; 
    ... 
} 

@Entity 
@Table(name = "RECORDING") 
@Where(clause = "deleted = '0'") 
@SQLDelete(sql = "UPDATE recording SET deleted = '1'") 
public class Recording extends AbstractEntity { 
    ... 
@ManyToOne 
@JoinColumn(name = "TARGET_ID") 
private Target target; 
    ... 
} 

La suppression est lui-même un appel à EntityManager:

entityManager.remove(target); 

Après cet appel, Target et tous ses Enregistrements ont un drapeau supprimé à TRUE comme prévu. MAIS les enregistrements ont également la colonne TARGET_ID définie sur NULL, ce qui est assez regrettable puisque la relation est perdue. Ce n'est pas ce à quoi je m'attendrais et la restauration de l'état est impossible. Je m'attendrais à ce que le TARGET_ID contienne toujours la référence à la cible.

Est-ce que je fais quelque chose de mal? Ou dois-je appeler supprimer pour chaque enregistrement manuellement sans utiliser de cascades? Fait avec Spring Data JPA 1.11.4, Hibernate 5.0.12 et JPA2.1.

Merci pour les conseils

Répondre

0

Votre relation @OneToMany de cible à des enregistrements est définie incoretly. Essayez:

@OneToMany(mappedBy="target", cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
private Set<Recording> recordings; 
+0

La relation est très bien. De cette façon, vous pouvez gérer la relation des deux côtés sans effort supplémentaire. – user1622058