Я прочитал несколько похожих вопросов, но они не совсем такие же, как у меня.
Я использую 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 с дочерними элементами, он также удаляет дочерние элементы.
Спасибо за ваше время и хорошие советы!