Как вызвать обновление немедленно для сущности с помощью Hibernate EntityManager без написания запроса вручную? - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть объект 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);, но такого метода не существует.

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