У нас есть кодовая база с сущностями JPA, каждая из которых имеет поле long
, помеченное @Version
. В ходе транзакции оптимистичные c блокировки захватываются некоторыми объектами с entityManager.lock(entity, LockModeType.OPTIMISTIC)
, поэтому при фиксации транзакции EclipseLink запускает запросы следующей формы:
UPDATE <table> SET VERSION = <x> where ((ID = <y>) AND (VERSION = <x>));
, где y
- это ID объекта и x
- номер текущей версии (он не обновляется). Однако по какой-то причине он выполняет каждый запрос по отдельности, например (из журналов MySQL):
UPDATE TableA SET VERSION = 5 WHERE ((ID = 1) AND (VERSION = 5));
UPDATE TableA SET VERSION = 4 WHERE ((ID = 2) AND (VERSION = 4));
UPDATE TableA SET VERSION = 3 WHERE ((ID = 3) AND (VERSION = 3));
UPDATE TableA SET VERSION = 2 WHERE ((ID = 4) AND (VERSION = 2));
UPDATE TableA SET VERSION = 1 WHERE ((ID = 5) AND (VERSION = 1));
-- etc
В то время как мы хотим, чтобы все запросы для одной и той же таблицы были объединены в одну UPDATE
.
Есть ли где-нибудь флаг, который нам нужно установить, чтобы включить это? Типичная транзакция может генерировать сотни таких запросов для одной и той же таблицы.