У меня есть этот вид объектов:
Документ | 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, но тем не менее та же проблема.
Решение:
- Был каскадетап. В отношениях @manytoOne! Удалил его.
Почему это решение?
- Если вы хотите удалить ребенка, вы, безусловно, не хотите удалять его родитель, потому что могут быть другие дети, связанные с этим родителем.
Кажется, что опции Каскада где-то заставляют Entity Manager думать, что этот или какой-то другой объект в цепочке должен быть сохранен, когда вы вызываете em.remove(document). Нужно больше подробностей...
Я вижу, вы настраиваете каскад в двух местах:
@OneToMany
и @Cascade
. Я думаю, что это может быть проблемой, если одно отменяет другое ...
Ошибка, о которой Вы сообщаете, нуждается в дополнительном контексте, чтобы ее можно было понять. "Удаление уже удаленной сущности" включает в себя, очевидно, две операции ..... Вам нужно подробно описать состояние до, операции и состояние после (с "state" я имею в виду состояние в базе данных...).
Я предполагаю, что вы позвонили Удалить ()
на типе PropertyType
раньше. Вызов Удалить ()
[) только для «корневой» объекта и удалить остальных чем-то вроде:
document.getDocumentType().getPropertyTypes().remove(propertyType);
и сохранить DELETE_ORPHAN
, вы можете затем , после Проверка, вы не вызванные вручную Удалить ()
в других объектах, попробуйте позвонить:
document = entityManager.merge(document);
entityManager.remove(document);
так, чтобы EntityManager
сначала переосматривает объект с сеансом.