Warum gibt findById mit Hibernate Reactive und Panache veraltete Daten zurück?
Posted: 29 Dec 2024, 11:04
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:
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:
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:
Hauptfragen:
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"));
}
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"));
}
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"));
}
}
- Warum werden im zweiten Fall immer veraltete Daten zurückgegeben?< /li>
Warum löst die Verwendung von session.refresh dieses Problem?