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




Операция удаления не выполняется каскадно, поскольку @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. Это также можно сделать на уровне базы данных.