У меня есть родительский файл со следующим полем ...
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, optional = true, orphanRemoval = true)
@JoinColumn(name = "rcp_pf_id_photodata")
private PersistableFile photoData;
Сохраняемый файл выглядит следующим образом:
@Entity
@Table(name = "PERSISTABLE_FILE")
public class PersistableFile
{
@SequenceGenerator(allocationSize=1, initialValue=1, sequenceName="persistablefile_pf_id_seq", name="persistablefile_pf_id_seq")
@GeneratedValue(generator="persistablefile_pf_id_seq", strategy=GenerationType.SEQUENCE)
@Id
@Column(name = "pf_id")
private Long pfId;
@NotNull
@Column(name = "pf_filename")
private String filename;
@NotNull
@Column(name = "pf_content")
private byte[] content;
@NotNull
@Column(name = "pf_filetype")
private String filetype;
//more code
}
Когда родитель будет удален, сохраняемый файл (ребенок) будет также удален.Хорошо.Но когда родительский объект сохраняется, и я установил setPhotoData(null);
, дочерний элемент не будет удален.Очевидно, что Hibernate не достаточно умен, чтобы признать, что старые отношения были удалены.Если я сделаю setPhotoData(null)
, ничего не случится с дочерним элементом, и после обновления родительского объекта дочерний элемент останется в базе данных навсегда.
Это отношение @OneToOne, поэтому я не могу использовать clear()
.Я сомневаюсь, что установка для всех полей дочернего элемента значения NULL будет правильным способом удаления сироты (что невозможно из-за всех ненулевых полей), но как правильно это сделать?