проблема при обновлении объекта с помощью jpa - PullRequest
0 голосов
/ 21 апреля 2011

Я получаю следующую ошибку при попытке сохранить объект с помощью jpa.AM, получаю следующую ошибку

NestedThrowables:
<openjpa-1.2.2-SNAPSHOT-r422266:778978M-OPENJPA-975 nonfatal store error> org.apache.openjpa.persistence.OptimisticLockException: An optimistic lock violation was detected when flushing object instance "org.apache.openjpa.enhance.com$ibm$cloud$bss$client$db$data$Offeringattribute$pcsubclass-com.ibm.cloud.bss.client.db.data.Offeringattribute-10013800" to the data store.  This indicates that the object was concurrently modified in another transaction.

Теперь я решил эту ошибку в прошлый раз, вставив несколько операторов очистки, как показано ниже

em.persist(xyz);
em.flush(); //added this line
dbAttr.setOid((xyz.getId());
em.merge((xyz);

Но я не помню, делал ли я что-то еще в прошлый раз. Я получаю эту ошибку даже после добавления этого оператора flush.

Примечание: я запускаю мое приложение как автономное консольное приложение и уверен, что работает только 1 поток

Ответы [ 2 ]

1 голос
/ 03 мая 2011

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

<openjpa.RuntimeUnenhancedClasses=unsupported/>

Если это не поможет вам, вам нужно будет опубликовать вашу сущность, чтобы узнать больше о том, что происходит.

-Rick

0 голосов
/ 21 апреля 2011

Исключение оптимистической блокировки происходит, если вы пытаетесь обновить запись, которая была обновлена ​​кем-то / чем-либо еще с момента ее загрузки.Это не требует нескольких потоков.

Вы должны быть в состоянии решить проблему, перезагрузив объект непосредственно перед его изменением и сохранением.

---- обновите, чтобы ответить на вопрос --

Безопасный способ сделать это - закрыть Сессию и использовать load или get, и убедиться, что вы не изменили атрибут version (если у вас есть такая вещь)

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

Если это не так, мне нужно больше информации о том, что вы на самом деле делаете.

...