JPA CascadeType.Все не удалить детей-сирот
у меня возникли проблемы с удалением сиротских узлов с помощью JPA со следующим отображением
@OneToMany (cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "owner")
private List<Bikes> bikes;
у меня есть проблема осиротевших ролей, висящих вокруг базы данных.
Я могу использовать аннотации org.hibernate.annotations.Cascade Hibernate конкретный тег, но, очевидно, я не хочу связывать свое решение в реализацию Hibernate.
EDIT: кажется, JPA 2.0 будет включать поддержку для этого.
11 ответов:
Если вы используете его с Hibernate, вам придется явно определить аннотацию
CascadeType.DELETE_ORPHAN, который может быть использован в сочетании с JPACascadeType.ALL.Если вы не планируете использовать Hibernate, вам придется сначала явно удалить дочерние элементы, а затем удалить основную запись, чтобы избежать каких-либо сиротских записей.
последовательность выполнения
- извлечение основной строки должны быть удалены
- выборка дочерних элементов
- удалить все дочерние элементы
- удалить основной строки
- закрыть сеанс!--11-->
С JPA 2.0, теперь вы можете использовать опцию orphanRemoval = true
@OneToMany(mappedBy="foo", orphanRemoval=true)
Если вы используете JPA 2.0, теперь вы можете использовать на
@xxxToManyаннотация для удаления сирот.на самом деле
CascadeType.DELETE_ORPHANбыл осужден в 3.5.2-финал.
╔═════════════╦═════════════════════╦═════════════════════╗ ║ Action ║ orphanRemoval=true ║ CascadeType.ALL ║ ╠═════════════╬═════════════════════╬═════════════════════╣ ║ delete ║ deletes parent ║ deletes parent ║ ║ parent ║ and orphans ║ and orphans ║ ╠═════════════╬═════════════════════╬═════════════════════╣ ║ change ║ ║ ║ ║ children ║ deletes orphans ║ nothing ║ ║ list ║ ║ ║ ╚═════════════╩═════════════════════╩═════════════════════╝
вы можете использовать @PrivateOwned, чтобы удалить детей-сирот е.г
@OneToMany(mappedBy = "masterData", cascade = { CascadeType.ALL }) @PrivateOwned private List<Data> dataList;
по данным Java Persistence с Hibernate,каскад сирота удалить недоступно в качестве аннотации JPA.
Он также не поддерживается в JPA XML.
Я просто нахожу это решение, но в моем случае оно не работает:
@OneToMany(cascade = CascadeType.ALL, targetEntity = MyClass.class, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true)orphanRemoval = true не имеет никакого эффекта.
просто
@OneToMany(cascade = CascadeType.ALL, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true).удалить targetEntity = MyClass.класс, это отличная работа.
у меня была такая же проблема, и я задавался вопросом, почему это условие ниже не удалить сирот. Список блюд не был удален в Hibernate (5.0.3.Final) когда я выполнил именованный запрос на удаление:
@OneToMany(mappedBy = "menuPlan", cascade = CascadeType.ALL, orphanRemoval = true) private List<Dish> dishes = new ArrayList<>();потом я вспомнил, что я не следует использовать именованный запрос на удаление, но EntityManager. Как я использовал
EntityManager.find(...)метод для извлечения сущности, а затемEntityManager.remove(...), чтобы удалить его, блюда были также удалены.
Я использовал один к одному сопоставление , но ребенок не удалялся JPA давал нарушение внешнего ключа
после использования orphanRemoval = true, проблема была решена
Comments