Удаление сирот JPA не работает для отношений OneToOne

У кого-нибудь есть решение этой проблемы: https://hibernate.atlassian.net/browse/HHH-9663?

Я также сталкиваюсь с подобной проблемой. Когда я создал одностороннее (без обратной ссылки) отношение один к одному между двумя сущностями и установил атрибут удаления потерянных объектов в значение true, указанный объект все еще находится в базе данных после установки ссылки на ноль.

Вот пример модели домена:

@Entity
public class Parent {
  ...
  @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
  @JoinColumn(name = "child_id")
  private Child child;
  ...
}

@Entity
public class Child {
  ...
  @Lob
   private byte[] data;
  ...
}

В настоящее время я работаю над этим, удаляя сирот вручную.

Ответ 1

Каскадирование имеет смысл только для переходов состояния сущности, которые распространяются от Родителя к Дочернему. В вашем случае Родитель был фактически ребенком этой ассоциации (имея ФК).

Попробуйте использовать это сопоставление:

@Entity
public class Parent {
  ...
  @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "parent")
  private Child child;
  ...
}

@Entity
public class Child {

    @OneToOne
    @JoinColumn(name = "parent_id")
    private Parent parent;

    ...
    @Lob
    private byte[] data;
    ...
}

И для каскадного удаления сирот теперь необходимо:

Parent parent = ...;
parent.getChild().setParent(null);
parent.setChild(null);

Или, что еще лучше, используйте методы addChild/removeChild в классе Parent объекта:

public void addChild(Child child) {
    children.add(child);
    child.setParent(this);
}

public void removeChild(Child child) {
    children.remove(child);
    child.setParent(null);
}

Для более подробной информации, проверьте эту статью.