У меня есть проблема, пытаясь удалить объект, вот мой код:Не удается удалить отдельностоящий объект после слияния()
@Transactional
private <K> void delete(String type, EntityWithId<K> entity) {
try {
em.remove(em.contains(entity) ? entity : em.merge(entity));
} catch (Exception e) {
logger.warn("Unable to delete " + type + " with id " + entity.getId());
}
}
Я не понимаю, почему, но заявление удалить не удается, выбрасывая
java.lang.IllegalArgumentException: Removing a detached instance
Администратор сущности не содержит сущность, поэтому каждый раз выполняется слияние(), и удаление всегда завершается с ошибкой при передаче разных объектов.
Я что-то не так?
Вот StackTrace для пойманной Exception:
Unable to delete log with id 14091612
java.lang.IllegalArgumentException: Removing a detached instance myproj.jpa.AdvertisementLog#14091612
at org.hibernate.ejb.event.EJB3DeleteEventListener.performDetachedEntityDeletionCheck(EJB3DeleteEventListener.java:67)
at org.hibernate.event.internal.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:107)
at org.hibernate.event.internal.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:74)
at org.hibernate.internal.SessionImpl.fireDelete(SessionImpl.java:822)
at org.hibernate.internal.SessionImpl.delete(SessionImpl.java:801)
at org.hibernate.ejb.AbstractEntityManagerImpl.remove(AbstractEntityManagerImpl.java:880)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:365)
at com.sun.proxy.$Proxy59.remove(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240)
at com.sun.proxy.$Proxy59.remove(Unknown Source)
at myproj.batch.impl.DeleteOldAdvertisementsImpl.delete(DeleteOldAdvertisementsImpl.java:93)
at myproj.batch.impl.DeleteOldAdvertisementsImpl.deleteAll(DeleteOldAdvertisementsImpl.java:86)
at myproj.batch.impl.DeleteOldAdvertisementsImpl.deleteAll(DeleteOldAdvertisementsImpl.java:80)
at myproj.batch.impl.DeleteOldAdvertisementsImpl.deleteAd(DeleteOldAdvertisementsImpl.java:69)
at myproj.batch.impl.DeleteOldAdvertisementsImpl.clean(DeleteOldAdvertisementsImpl.java:54)
at myproj.batch.main.DeleteOldAdvertisementsMain.main(DeleteOldAdvertisementsMain.java:13)
Вы уверены, что 'remove' бросает исключение? Дайте нам трассировку стека. Это может быть «слияние», выбрасывающее исключение, возможно, он видит «сущность» как снятую/удаленную, следовательно, «IllegalArgumentException». – Dragan
Что делать, если вы делаете em.contains() на возвращенном объекте em.merge() - исключение указывает, что объект, который вы пытаетесь удалить, не подключен –
Исключение выбрано из вызова remove() и после вызова слияния объект все еще не содержится внутри EntityManager ... но у меня нет никакой подсказки, почему это происходит. – DocKuro