Мягкое удаление в спящем режиме с каскадом устанавливает 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;
Другие вопросы по тегам