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
.
удачи!