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

Я прочитал некоторые связанные вопросы, но они не совсем такая же проблема, как моя.

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

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

что-то типа:

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

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

Wich получите таблицу, как:

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
clas 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 для родителя? Я пробовал это, но я продолжаю получать ту же ошибку, ограничение fk нарушено.

Изменить 2

наконец-то решена с:

@Entity
clas 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 с childs, это childs также будет удален.

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

2 ответов


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

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

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


посмотреть orphanRemoval:

@OneToMany(cascade = CascadeType.REMOVE, orphanRemoval = true)

здесь полной экспликации о CascadeType.REMOVE и orphanRemoval.

удачи!