Мягкое удаление в спящем режиме с каскадом устанавливает FK в NULL
Я пытаюсь реализовать мягкое удаление, используя аннотацию Hibernate со следующими объектами:
@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;
...
}
Само удаление является вызовом EntityManager:
entityManager.remove(target);
После этого вызова и Target, и все его записи удалили флаг, установленный в TRUE, как и ожидалось. НО записи также имеют столбец TARGET_ID, установленный в NULL, что весьма прискорбно, так как отношение потеряно. Это НЕ то, чего я ожидал, и восстановить состояние невозможно. Я ожидаю, что TARGET_ID все еще содержит ссылку на Target.
Я делаю что-то неправильно? Или я должен вызвать удаление для каждой записи вручную без использования каскадов?
Выполнено с использованием Spring Data JPA 1.11.4, Hibernate 5.0.12 и JPA2.1.
Спасибо за любые советы
1 ответ
Ваше отношение @OneToMany от Target к Recordings установлено неправильно. Пытаться:
@OneToMany(mappedBy="target", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Set<Recording> recordings;