Как удалить сирот в отношении OneToOne в Hibernate, если родительский объект сохранен? - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть родительский файл со следующим полем ...

@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 будет правильным способом удаления сироты (что невозможно из-за всех ненулевых полей), но как правильно это сделать?

1 Ответ

0 голосов
/ 16 декабря 2018

Очевидно, что это работает с FetchType.EAGER.Похоже, ошибка для меня.

...