2015-10-24 4 views
1

У меня есть класс сущности JPA с полем @Version для оптимистической блокировки. Мне нужно указать merge() экземпляр отдельного объекта, у которого его поле версии неинициализировано поверх существующего экземпляра сущности в контексте персистентности. При этом управляемый экземпляр перезаписывает свое поле версии, что впоследствии приводит к исключению OptimisticLockException.Объединить отдельный объект JPA с полем @version

Я могу вручную скопировать содержимое поля версии из управляемого в удаленный объект до слияния, но я нахожу это немного неудобным. Есть ли лучший вариант или лучшая практика для обработки этого сценария?

+0

Почему поле версии не инициализировано? Была ли эта сущность, которую вы пытаетесь объединить, ранее загружалась из БД до отрыва? Итак, поле версии должно быть установлено во время поиска. – Ish

+0

Отделяемый объект не считывается из базы данных, а создается из данных из внешнего CSV-файла. Данные в этом файле должны использоваться для пакетного обновления всей базы данных. – pesche666

ответ

0

Выполнение слияния не будет работать, если у вас поле версии неинициализировано. Он должен быть там. Поставщику JPA придется сравнивать поле версии объекта, который вы пытаетесь объединить с версией, находящейся в базе данных. Если версия сущности старше того, что находится в базе данных, тогда ей придется выбросить исключение.

Что вы можете сделать вместо того, чтобы делать слияние, чтобы использовать обновление с помощью JPA запроса:

Query q = em.createQuery("UPDATE MyEntity me SET me.versionField = me.versionField + 1...."); 
q.executeUpdate(); 

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

+0

Объект, о котором идет речь, имеет другие связанные объекты и довольно много полей для слияния. Я не хочу делать это вручную, но пусть entitymanager выполняет слияние. Без поля версии это было довольно просто: – pesche666

+0

Возможно ли сохранить значение версии в файле CSV? Таким образом, когда вы создадите свои объекты, поле версии будет инициализировано. – Ish

+0

Создание отделяемого объекта из данных csv, затем слияние() всего графа объектов. С полем версии я должен найти() корневой объект в контексте персистентности, а затем объединить версии из управляемых в графы отдельных объектов, а затем merge(). Пока что самое легкое решение для меня, но оно все еще кажется довольно уродливым. – pesche666

Смежные вопросы