JPA CascadeType.ALL не удаляет сирот
Вопрос
У меня возникли проблемы при удалении потерянных узлов с использованием JPA со следующим отображением
@OneToMany (cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "owner")
private List<Bikes> bikes;
У меня проблема с осиротевшими ролями, висящими вокруг базы данных.
Я могу использовать аннотацию org.hibernate.annotations.Cascade
для конкретного тега Hibernate, но, очевидно, я не хочу связывать свое решение с реализацией Hibernate.
РЕДАКТИРОВАТЬ . Похоже, что JPA 2.0 будет включать поддержку для этого.
Решение
Если вы используете его с Hibernate, вам придется явно определить аннотацию CascadeType.DELETE_ORPHAN
, которую можно использовать вместе с JPA CascadeType.ALL
. Р>
Если вы не планируете использовать Hibernate, вам придется сначала явно удалить дочерние элементы, а затем удалить основную запись, чтобы избежать любых потерянных записей.
последовательность выполнения
<Ол>В JPA 2.0 теперь вы можете использовать опцию orphanRemoval = true
@OneToMany(mappedBy="foo", orphanRemoval=true)
Другие советы
Если вы используете JPA 2.0, теперь вы можете использовать атрибут orphanRemoval = true
аннотации @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 ║ ║ ║
╚═════════════╩═════════════════════╩═════════════════════╝
Если вы используете JPA с EclipseLink, вам нужно установить аннотацию @PrivateOwned .
Документация: Eclipse Wiki - Использование EclipseLink JPA-расширений - Глава 1.4 Как использовать @PrivateOwned Annotation / а> р>
вы можете использовать @PrivateOwned для удаления сирот например р>
@OneToMany(mappedBy = "masterData", cascade = {
CascadeType.ALL })
@PrivateOwned
private List<Data> dataList;
Согласно сохранению Java в Hibernate , каскадное удаление сирот недоступно как аннотация JPA. Р>
Это также не поддерживается в JPA XML.
Я просто нахожу это решение, но в моем случае оно не работает:
@OneToMany(cascade = CascadeType.ALL, targetEntity = MyClass.class, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true)
orphanRemoval = true не имеет никакого эффекта.
У меня была та же проблема, и я удивился, почему это условие ниже не удаляет сирот. Список блюд не был удален в Hibernate (5.0.3.Final), когда я выполнил именованный запрос на удаление:
@OneToMany(mappedBy = "menuPlan", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Dish> dishes = new ArrayList<>();
Потом я вспомнил, что мне нельзя использовать именованный запрос на удаление , а EntityManager. Поскольку я использовал метод EntityManager.find (...)
для извлечения объекта, а затем EntityManager.remove (...)
для его удаления, блюда были удалены как Что ж. Р>
Просто @OneToMany (cascade = CascadeType.ALL, mappedBy = & xot; xxx " ;, fetch = FetchType.LAZY, orphanRemoval = true)
.
Удалите targetEntity = MyClass.class , это прекрасно работает.
Для записей в OpenJPA до JPA2 это был @ElementDependant.
Я использовал однозначное сопоставление, но дочерний элемент не удалялся. JPA передавал нарушение внешнего ключа
После использования orphanRemoval = true проблема решена