ConstraintViolationException с CascadeType из пакета Hibernate

Приложение использует Hibernate 3, и я читал некоторые проблемы с аннотациями JPA и аннотациями Hibernate. См. Каскад распространенных ошибок.

Я работаю с устаревшим кодом, поэтому сущностями полный беспорядок.

Раньше моя сущность была:

    @OneToMany(mappedBy = "order", targetEntity = Investiment.class, fetch = FetchType.LAZY)
    @Cascade({org.hibernate.annotations.CascadeType.ALL,
            org.hibernate.annotations.CascadeType.DELETE_ORPHAN,
            org.hibernate.annotations.CascadeType.PERSIST,
            org.hibernate.annotations.CascadeType.MERGE,
            org.hibernate.annotations.CascadeType.REMOVE,
            org.hibernate.annotations.CascadeType.REFRESH,
            org.hibernate.annotations.CascadeType.SAVE_UPDATE})
    private List<Investment> investment;

    @ManyToMany(
            cascade = {CascadeType.PERSIST},
            targetEntity = Discount.class,
            fetch = FetchType.EAGER)
    @JoinTable(name = "cupons_campanha_pedido")
    private List<Discount> discountList;

    @Column(name = "nfeAccessKey")
    private String nfeAccessKey;

    @OneToMany(cascade = {CascadeType.ALL})
    @Cascade(value = {org.hibernate.annotations.CascadeType.ALL, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
    @JoinColumn(name = "idOrder")
    @LazyCollection(LazyCollectionOption.FALSE)
    private List<Item> itens;

У меня много объект ссылается на несохраненный временный экземпляр — сохраните временный экземпляр перед сбросом: com.company.entity.Investment

Для меня была очень странной установка в качестве CascadeType.ALL и установка заново всех возможных перечислений. Поэтому я меняю только инвестиционные аннотации:

        @OneToMany(mappedBy = "order", targetEntity = Investment.class, fetch = FetchType.LAZY)
        @Cascade({org.hibernate.annotations.CascadeType.ALL})
        private List<Investment> investment;

Первое исключение остановлено. Но точно знаю, что я получил это (не часто, но случается):

WARN - 2019-01-31 19:25:18.470: SQL Error: 0, SQLState: 23503 ERROR - 2019-01-31 19:25:18.471: Batch entry 0 delete from order where id=1096523 was aborted: ERROR: update or delete on table "order" violates foreign key constraint "fk10e0b022beb033fc" on table "orderinvestment" Detail: Key (id)=(1096523) is still referenced from table "orderinvestment". Call getNextException to see other errors in the batch. WARN - 2019-01-31 19:25:18.471: SQL Error: 0, SQLState: 23503 ERROR - 2019-01-31 19:25:18.472: ERROR: update or delete on table "order" violates foreign key constraint "fk10e0b022beb033fc" on table "orderinvestment" Detail: Key (id)=(1096523) is still referenced from table "orderinvestment". ERROR - 2019-01-31 19:25:18.472: Could not synchronize database state with session org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)

Это происходит при звонках

getHibernateTemplate().saveOrUpdate(entity);

Я знаю, что Hibernate — это реализация JPA, но есть некоторые проблемы с использованием аннотаций JPA. Так что лучше использовать только аннотации Hibernate. В этом случае Инвестиции устанавливаются как org.hibernate.annotations.CascadeType.ALL. Почему это происходит?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
341
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Операция удаления не выполняется каскадно, поскольку @OneToMany опция каскада по умолчанию отсутствует. Попробуйте установить @OneToMany(cascade=ALL)

Hibernate — это реализация JPA. Аннотации JPA можно использовать без аннотаций Hibernate, но нельзя использовать Hibernate без аннотаций JPA.

Попробуйте удалить аннотацию спящего режима @Cascade и использовать только каскад JPA в @OneToMany.

Ответ принят как подходящий

Вам необходимо синхронизировать обе стороны отношений:

parent.getChildren().remove(child); // on the parent side
child.getParent() = null; // on the child side

Другим решением было бы удаление сирот: removeOrphans = true в аннотации @OneToMany. Это также можно сделать на уровне базы данных.

Другие вопросы по теме

Похожие вопросы

Невозможно подключиться к базе данных Oracle с помощью ojdbc8 после обновления Java с версии 8u144 — любое обновление после версии 8u171 включительно
Как отправлять асинхронные запросы/ответы через взаимодействующие адаптеры каналов без корреляции данных
Есть ли способ прикрепить файл любого типа к электронному письму с помощью намерений?
Обновление библиотек Android Firebase вызывает сбой
Есть ли способ разархивировать файл, одновременно проверяя файл, который в данный момент распаковывается?
Попытка зациклиться на начало программы
Ошибка пакета com.teamdev.jxbrowser.chromium.swing.BrowserView в netbeans 8.2
Ошибка при запуске Eclipse с панели инструментов избранного java.lang.ClassNotFoundException: org.eclipse.core.runtime.adaptor.EclipseStarter
Созданный JLabel в другом классе и реализованный в основном классе не отображается
Проблемы с поиском bean-компонентов WebLogic 12c EJB3 из удаленного приложения