Почему findById возвращает устаревшие данные с помощью Hibernate Reactive и Panache?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Почему findById возвращает устаревшие данные с помощью Hibernate Reactive и Panache?

Сообщение Anonymous »

Я работаю с Quarkus, Hibernate Reactive и Panache Reactive и заметил неожиданное поведение при обновлении объекта в базе данных. . У меня есть две версии метода, который изменяет экземпляр Workplace, но они ведут себя по-разному.
Вот первый метод:

Код: Выделить всё

@WithTransaction
public Uni modifyWorkplace(Workplace request) {
return workplaceRepository.update("nickname = ?1, version = ?2 where id = ?3",
request.getNickname(),
request.getVersion(),
request.getId())
.onItem().transformToUni(updateCount -> {
return workplaceRepository.findById(request.getId());
})
.onItem().ifNull().failWith(() -> new IllegalArgumentException("Workplace not found"));
}
С помощью этого кода, если я выполняю операцию загрузки сразу после обновления, я получаю обновленные поля. Однако при использовании второго метода результат будет другим:

Код: Выделить всё

@WithSession
@WithTransaction
public Uni modifyWorkplace(Workplace request) {
return workplaceRepository.findById(request.getId())
.chain(existing ->
workplaceRepository.update("nickname = ?1, version = ?2 where id = ?3",
request.getNickname(),
request.getVersion(),
request.getId())
.chain(updateCount -> {
return workplaceRepository.findById(request.getId());
})
)
.onItem().ifNull().failWith(() -> new IllegalArgumentException("Workplace not found"));
}
При таком подходе findById всегда возвращает старый, устаревший объект вместо обновленного. Чтобы это исправить, я создал третью версию метода, используя session.refresh, и она работает правильно:

Код: Выделить всё

    @WithSession
@WithTransaction
public Uni modifyWorkplace(Workplace request) {
return workplaceRepository.findById(request.getId())
.onItem()
.ifNotNull()
.transformToUni(existing ->
workplaceRepository.update("nickname = ?1, version = ?2 where id = ?3", request.getNickname(), request.getVersion(), request.getId())
.onItem().transformToUni(updateCount -> {
return workplaceRepository.getSession()
.onItem()
.ifNotNull()
.transformToUni(session -> session.refresh(existing).replaceWith(existing));
})
)
.onItem().ifNull().failWith(() -> new IllegalArgumentException("Workplace not found"));
}
}
Основные вопросы:
  • Почему во втором случае всегда возвращаются устаревшие данные?< /li>
    Почему использование session.refresh решает эту проблему?
Заранее благодарим вас за помощь !

Подробнее здесь: https://stackoverflow.com/questions/793 ... nd-panache
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Почему findById возвращает устаревшие данные с помощью Hibernate Reactive и Panache?
    Anonymous » » в форуме JAVA
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Quarkus Panache Reactive, почему транзакция не может быть отправлена/подписана из потока исполнителя
    Anonymous » » в форуме JAVA
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Quarkus hibernate orm panache - пакетные вставки не работают
    Anonymous » » в форуме JAVA
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Quarkus hibernate orm panache - пакетные вставки не работают
    Anonymous » » в форуме JAVA
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Hibernate @Filter не работает с методом Spring JpaRepository.findById
    Anonymous » » в форуме JAVA
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»