Warum gibt findById mit Hibernate Reactive und Panache veraltete Daten zurück?Java

Java-Forum
Anonymous
 Warum gibt findById mit Hibernate Reactive und Panache veraltete Daten zurück?

Post by Anonymous »

Ich arbeite mit Quarkus, Hibernate Reactive und Panache Reactive und habe beim Aktualisieren einer Entität in der Datenbank unerwartetes Verhalten festgestellt . Ich habe zwei Versionen einer Methode, die eine Workplace-Instanz ändert, aber sie verhalten sich unterschiedlich.
Hier ist die erste Methode:

Code: Select all

@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"));
}
Wenn ich mit diesem Code unmittelbar nach der Aktualisierung einen Ladevorgang ausführe, erhalte ich die aktualisierten Felder. Bei der zweiten Methode ist das Ergebnis jedoch anders:

Code: Select all

@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"));
}
Bei diesem Ansatz gibt findById immer das alte, veraltete Objekt anstelle des aktualisierten zurück. Um dies zu beheben, habe ich mit session.refresh eine dritte Version der Methode erstellt, die ordnungsgemäß funktioniert:

Code: Select all

    @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"));
}
}
Hauptfragen:
  • Warum werden im zweiten Fall immer veraltete Daten zurückgegeben?< /li>
    Warum löst die Verwendung von session.refresh dieses Problem?
Vielen Dank im Voraus für Ihre Hilfe !

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post