Подтвердить что ты не робот

JPA + Hibernate + Spring + OneToMany удалить каскад

Я прочитал несколько похожих вопросов, но они не совсем такие же, как у меня.

Я использую JPA + Hibernate + Spring и хочу сделать что-то, в чем я не уверен, возможно ли это только с помощью config.

У меня есть доменные классы с более или менее сложным отношением. Есть много элементов, связанных с одним элементом (например, если это было дерево, многие элементы являются сыновьями одного элемента).

Что-то вроде:

@Entity
class Foo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @ManyToOne
    @JoinColumn(name = "PARENT_ID")
    private Foo parentNode;
    ...
}

Который получит таблицу вроде:

Foo id    parent_id
1
2         1 
3         1

Когда я удаляю строку с id = 1, я хочу удалить строки с id = 2 и id = 3 (это может быть рекурсивно, элементы с parent_id = 2 и parent_id = 3 также будут удалены).

Для некоторых ограничений у меня может быть только отношение со стороны сына со ссылкой parent_id.

У меня вопрос: возможно ли это сделать с помощью конфигурации JPA или Hibernate или мне нужно выполнить какую-то рекурсивную функцию для удаления всех детей и всех родителей?

Я пробовал с:

@OneToMany(name = "PARENT_ID", cascade = CascadeType.REMOVE)

И я читал, что, возможно, используя аннотации Hibernate.

Если кто-нибудь может дать мне какую-то подсказку, я потерялся на этом этапе.

Изменить 1

Можно ли будет сделать как:

@Entity
class Foo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @ManyToOne
    @JoinColumn(name="PARENT_ID")
    private Foo parentNode;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "parentNode", cascade = CascadeType.REMOVE, orphanRemoval = true)
    private Set<Foo> childs = new LinkedHashSet<Foo>();
    ...
}

Сохранение таблицы как есть, с ФК для родителя? Я пробовал это, но я продолжаю получать ту же ошибку, ограничение fk нарушено.

Изменить 2

Окончательно решено с помощью:

@Entity
class Foo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @ManyToOne
    @JoinColumn(name = "PARENT_ID")
    private Foo parentNode;

    @OneToMany(mappedBy = "parentNode", cascade = CascadeType.REMOVE)
    private Set<Foo> childs = new LinkedHashSet<Foo>();
    ...
}

Это @OneToMany необходимо, даже если мы выполняем сопоставление в нашем BBDD, ссылаясь только на родительский идентификатор.

Теперь, когда мы удаляем Foo с дочерними элементами, он также удаляет дочерние элементы.

Спасибо за ваше время и хорошие советы!

4b9b3361

Ответ 1

Отношения в JPA всегда однонаправлены, если вы не связываете родителя с дочерним в обоих направлениях. Каскадные операции REMOVE из родительского элемента в дочерние объекты потребуют отношения от родителя к ребенку (а не только наоборот).

Итак, здесь вам нужно изменить однонаправленную связь на двунаправленную.

для получения дополнительной информации см. эту ссылку.