У меня есть объект MyEntity
, который я хотел бы обновить, не закрывая текущую транзакцию, но немедленно вызвать обновление в транзакции.
Я попытался entityManager.merge(entity);
, но он не выполняет запрос на обновление для объекта.
Текущая логика следующая:
// begin repeatable read transaction
MyEntity entity = entityManager.find(MyEntity.class, pk);
// do some logic
if(something){
entityManager.merge(entity);
}
// do other logic
// commit transaction
Во время транзакции сущность может обновляться или нет.Если сущность обновляется, то мы должны запретить другим транзакциям обновлять сущность (при использовании транзакции repeatable read
другие сущности не смогут обновить сущность, пока текущая транзакция не завершена).
Сейчас вместо entityManager.merge(entity);
мне нужно написать длинный update query
вручную, что выглядит ужасно.Есть ли другой способ вызвать обновление для сущности без закрытия текущей транзакции?
Возможный обходной путь, который я вижу, состоит в том, чтобы использовать пессимистические блокировки, но это не очень хорошо, потому что если мы используем пессимистическую блокировку в первой entityManager.find(pk);
тогда объект будет заблокирован во время do some logic
процесса.Если мы установим блокировку для сущности после этой логики, то hibernate сделает дополнительный запрос в базу данных, что тоже не хорошо.
Идеальный метод будет entityManager.update(entity);
, но такого метода не существует.