Ответ 1
Решение:
- В отношениях @ManyToOne был CascadeType.REMOVE! Удалено.
Почему это решение?
- если вы хотите удалить дочерний элемент, который вы НЕВОЗМОЖНО удалить своего родителя, потому что могут быть другие дети, связанные с этим родителем.
У меня есть такие объекты:
Документ | n.. в ..1 | Тип документа | 1.. в .. n | PropertyType | 1.. в .. n | DocumentProperty
Я просто пытаюсь удалить документ, например: entityManager.remove(документ);
но возникает ошибка:
16: 45: 51,499 ОШИБКА [[Servle Resource Servlet]] Servlet.service() для сервлета Seam Resource Servlet исключение javax.persistence.EntityNotFoundException: удаленный объект, переданный для сохранения: [up.docstore.PropertyType #]
Проблема, похоже, исходит отсюда:
@OneToMany(mappedBy = "documentType", cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
@ForeignKey(name = "FK_DOCUMENT_TYPE__PROPERTY_TYPE")
@Sort(type = SortType.NATURAL)
private SortedSet<PropertyType> propertyTypes = new TreeSet<PropertyType>();
Если я удалю CascadeType.PERSIST, все это работает. Но я нуждаюсь в нем, а также мне это нужно EAGERLY.
Кто-нибудь знает другое решение?
Изменить: удалена каскад DELETE_ORPHAN, но все та же проблема.
Решение:
- В отношениях @ManyToOne был CascadeType.REMOVE! Удалено.
Почему это решение?
- если вы хотите удалить дочерний элемент, который вы НЕВОЗМОЖНО удалить своего родителя, потому что могут быть другие дети, связанные с этим родителем.
Я предполагаю, что вы раньше вызывали remove()
по типу PropertyType
. Вызовите remove()
только для корневого объекта и удалите остальные с помощью чего-то вроде:
document.getDocumentType().getPropertyTypes().remove(propertyType);
И сохраните DELETE_ORPHAN
Затем вы можете после подтверждения вы не вручную называть remove()
на других объектах, попробуйте позвонить:
document = entityManager.merge(document);
entityManager.remove(document);
так что EntityManager
сначала переносит объект с сеансом.
Я вижу, что вы устанавливаете cascade
в двух местах: @OneToMany
и @Cascade
. Я думаю, что это может быть проблемой, если переопределить другую...
Ошибка, о которой вы сообщаете, нуждается в еще большем контексте, чтобы быть понятным. "Удаление уже удаленной сущности" включает в себя четкие две операции.... Вам нужно указать подробности о состоянии до, операции и состояние после (с "состоянием", я имею в виду состояние в базе данных...).
Кажется, что параметры Cascade где-то заставляют Entity Manager думать, что этот объект или какой-либо другой объект в цепочке должен сохраняться при вызове em.remove(document). Нужна более подробная информация...