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

У меня есть этот вид объектов:

Документ | n.. к.. 1 | DocumentType | 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. СОХРАНИТЕ все, что это работает. Но мне нужен он там, и также мне нужен он НЕТЕРПЕЛИВО.

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

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

10
задан Bozho 2 February 2010 в 07:33
поделиться

4 ответа

Решение:

  • Был каскадетап. В отношениях @manytoOne! Удалил его.

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

  • Если вы хотите удалить ребенка, вы, безусловно, не хотите удалять его родитель, потому что могут быть другие дети, связанные с этим родителем.
12
ответ дан 3 December 2019 в 20:41
поделиться

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

0
ответ дан 3 December 2019 в 20:41
поделиться

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


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

0
ответ дан 3 December 2019 в 20:41
поделиться

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

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

и сохранить DELETE_ORPHAN

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

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

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

6
ответ дан 3 December 2019 в 20:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: