Приложение использует 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.Почему это происходит?