Удаленный объект передан в постоянное исключение - PullRequest
10 голосов
/ 01 февраля 2010

У меня есть такие сущности:

Документ | н .. в ..1 | Тип документа | 1 .. в .. n | PropertyType | 1 .. в .. n | DocumentProperty

Я просто пытаюсь удалить документ вроде: entityManager.remove (документ);

но возникает ошибка:

16: 45: 51,499 ОШИБКА [[Сервлет ресурсов шва]] Servlet.service () для сервлета Исключение выброса сервлета ресурсов шва 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, все это работает. Но мне это нужно там, а также мне нужно ОЧЕНЬ.

Кто-нибудь знает другое решение?

Редактировать : удален каскад DELETE_ORPHAN, но все та же проблема.

Ответы [ 4 ]

12 голосов
/ 02 февраля 2010

Решение:

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

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

  • если вы хотите удалить ребенка, вы ОБЯЗАТЕЛЬНО не хотите удалять его родителя, поскольку могут быть другие дети, связанные с этим родителем.
6 голосов
/ 02 февраля 2010

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

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

и сохранить DELETE_ORPHAN

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

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

так, чтобы EntityManager заново связал объект с сеансом первым.

0 голосов
/ 01 февраля 2010

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

0 голосов
/ 01 февраля 2010

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


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

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