EntityNotFoundException для вновь связанной сущности - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть объект DEVICE, который связан с объектом PROPERTIES, как определено ниже,

@OneToOne(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY, orphanRemoval = true)
private Properties properties;

, где объект PROPERTIES имеет следующий идентификатор,

@Id
@Column(name=ID)
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;

У меня два потокапараллельный,

Thread-1 -> Для DEVICE-1 он попытается получить объект PROPERTIES.Это было как нуль (свойство не определено).Следовательно, он создаст новый PROPERTIES-1 и добавит в сущность DEVICE-1.

Thread-2 -> Пытается удалить DEVICE-1.Во время удаления выдается ниже исключения.

javax.persistence.EntityNotFoundException: Unable to find com.entity.properties with id 3
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$JpaEntityNotFoundDelegate.handleEntityNotFound(EntityManagerFactoryBuilderImpl.java:181)
    at org.hibernate.proxy.AbstractLazyInitializer.checkTargetState(AbstractLazyInitializer.java:262)
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:176)
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:286)
    at org.hibernate.engine.internal.StatefulPersistenceContext.unproxyAndReassociate(StatefulPersistenceContext.java:603)
    at org.hibernate.event.internal.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:89)
    at org.hibernate.internal.SessionImpl.fireDelete(SessionImpl.java:929)
    at org.hibernate.internal.SessionImpl.delete(SessionImpl.java:906)
    at org.hibernate.engine.spi.CascadingActions$1.cascade(CascadingActions.java:74)
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:350)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:293)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:161)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:118)
    at org.hibernate.event.internal.DefaultDeleteEventListener.cascadeAfterDelete(DefaultDeleteEventListener.java:376)
    at org.hibernate.event.internal.DefaultDeleteEventListener.deleteEntity(DefaultDeleteEventListener.java:312)
    at org.hibernate.event.internal.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:160)
    at org.hibernate.event.internal.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:73)
    at org.hibernate.internal.SessionImpl.fireDelete(SessionImpl.java:920)
    at org.hibernate.internal.SessionImpl.delete(SessionImpl.java:896)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.remove(AbstractEntityManagerImpl.java:1214)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.8.0_131]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)[:1.8.0_131]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.8.0_131]
    at java.lang.reflect.Method.invoke(Method.java:498)[:1.8.0_131]
    at org.apache.aries.jpa.support.osgi.impl.EmProxy.invoke(EmProxy.java:43)
    at com.sun.proxy.$Proxy130.remove(Unknown Source)
    at Proxyc164ca4b_578b_459f_ace4_b5791bab5274.remove(Unknown Source)

Эта проблема наблюдается, когда эти два потока выполняются одновременно с некоторой разницей в миллисекунды.Пожалуйста, помогите мне понять возможность / причину этой ошибки.

1 Ответ

0 голосов
/ 04 марта 2019

После небольшого анализа я увидел, что hibernate создает прокси для сущности PROPERTIES с правильным идентификатором.Затем во время процесса удаления он пытается загрузить фактическую сущность из сеанса.Если этот объект не найден в сеансе, что приводит к исключению EntityNotFoundException.

Использование FetchType.EAGER загрузит реальный объект и исключит это исключение.

Версия Hibernate: 4.3.6.Final

Даже изменение уровня изоляции с REPEATABLE READ на READ COMMITTED также решило проблему.Но в качестве решения мы применили механизм повтора для EntityNotFoundException.

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