ConstraintViolationException с CascadeType из пакета Hibernate - PullRequest
0 голосов
/ 01 февраля 2019

Приложение использует 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: 0, SQLState: 23503 ОШИБКА - 2019-01-31 19: 25: 18.471: Пакетная запись 0 удаляется из заказа, где id = 1096523 был прерван: ОШИБКА: обновление или удаление в таблице «заказ» нарушает ограничение внешнего ключа «fk10e0b022beb033fc» для таблицы «Заказ инвестиций» Подробно: Ключ (id) =(1096523) до сих пор упоминается из таблицы «Порядок инвестирования».Вызовите getNextException, чтобы увидеть другие ошибки в пакете.ПРЕДУПРЕЖДЕНИЕ - 2019-01-31 19: 25: 18.471: ошибка SQL: 0, SQLState: 23503 ОШИБКА - 2019-01-31 19: 25: 18.472: ОШИБКА: обновление или удаление в таблице "порядок" нарушает ограничение внешнего ключа "fk10e0b022beb033fc"on table" orderinvestment "Detail: Key (id) = (1096523) по-прежнему упоминается из таблицы" orderinvestment ".ОШИБКА - 2019-01-31 19: 25: 18.472: Не удалось синхронизировать состояние базы данных с сеансом org.hibernate.exception.ConstraintViolationException: Не удалось выполнить пакетное обновление JDBC в org.hibernate.exception.SQLStateConverter.convert (SQLStateConverter.java:71) в org.hibernate.exception.JDBCExceptionHelper.convert (JDBCExceptionHelper.java:43)

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

getHibernateTemplate().saveOrUpdate(entity);

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

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

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

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

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

0 голосов
/ 03 февраля 2019

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

Hibernate - это реализация JPA.JPA-аннотации могут использоваться без аннотаций Hibernate, но не Hibernate без аннотаций JPA.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...