Вопрос

У меня возникли проблемы при удалении потерянных узлов с использованием 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 проблема решена

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top