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