Удаленный объект передан для сохранения исключения

У меня есть такие объекты:

Документ    | 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, но все та же проблема.

Ответ 1

Решение:

  • В отношениях @ManyToOne был CascadeType.REMOVE! Удалено.

Почему это решение?

  • если вы хотите удалить дочерний элемент, который вы НЕВОЗМОЖНО удалить своего родителя, потому что могут быть другие дети, связанные с этим родителем.

Ответ 2

Я предполагаю, что вы раньше вызывали remove() по типу PropertyType. Вызовите remove() только для корневого объекта и удалите остальные с помощью чего-то вроде:

document.getDocumentType().getPropertyTypes().remove(propertyType);

И сохраните DELETE_ORPHAN

Затем вы можете после подтверждения вы не вручную называть remove() на других объектах, попробуйте позвонить:

document = entityManager.merge(document);
entityManager.remove(document);

так что EntityManager сначала переносит объект с сеансом.

Ответ 3

Я вижу, что вы устанавливаете cascade в двух местах: @OneToMany и @Cascade. Я думаю, что это может быть проблемой, если переопределить другую...


Ошибка, о которой вы сообщаете, нуждается в еще большем контексте, чтобы быть понятным. "Удаление уже удаленной сущности" включает в себя четкие две операции.... Вам нужно указать подробности о состоянии до, операции и состояние после (с "состоянием", я имею в виду состояние в базе данных...).

Ответ 4

Кажется, что параметры Cascade где-то заставляют Entity Manager думать, что этот объект или какой-либо другой объект в цепочке должен сохраняться при вызове em.remove(document). Нужна более подробная информация...