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 будет включать поддержку для этого.

931   11  

11 ответов:

Если вы используете его с Hibernate, вам придется явно определить аннотацию CascadeType.DELETE_ORPHAN, который может быть использован в сочетании с JPA CascadeType.ALL.

Если вы не планируете использовать Hibernate, вам придется сначала явно удалить дочерние элементы, а затем удалить основную запись, чтобы избежать каких-либо сиротских записей.

последовательность выполнения

  1. извлечение основной строки должны быть удалены
  2. выборка дочерних элементов
  3. удалить все дочерние элементы
  4. удалить основной строки
  5. закрыть сеанс!--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     ║                     ║                     ║
╚═════════════╩═════════════════════╩═════════════════════╝

Если вы используете JPA с EclipseLink, вам нужно будет установить @PrivateOwned Примечание.

документы: Eclipse Wiki-использование расширений EclipseLink JPA-глава 1.4 Как использовать аннотацию @PrivateOwned

вы можете использовать @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(...), чтобы удалить его, блюда были также удалены.

для записей, в OpenJPA до JPA2 это было @ElementDependant.

Я использовал один к одному сопоставление , но ребенок не удалялся JPA давал нарушение внешнего ключа

после использования orphanRemoval = true, проблема была решена

Comments

    Ничего не найдено.