Ereignisse und Aktualisierungen 24.00
Repository-Ereignisse ermöglichen es Ihnen, auf Datenänderungen zu reagieren. Über die automatischen UI-Aktualisierungen hinaus können Sie auf Änderungen hören, um benutzerdefinierte Logik auszulösen.
Repository-Ereignislebenszyklus
Jeder Aufruf von commit() löst ein RepositoryCommitEvent aus. Dieses Ereignis enthält Informationen darüber, was sich geändert hat:
repository.onCommit(event -> {
// Alle bestätigten Entitäten abrufen
List<Customer> commits = event.getCommits();
// Überprüfen, ob es sich um eine Aktualisierung einer einzelnen Entität handelt
if (event.isSingleCommit()) {
Customer updated = event.getFirstCommit();
System.out.println("Aktualisiert: " + updated.getName());
}
});
Das Ereignis informiert Sie:
getCommits()- Liste der Entitäten, die bestätigt wurdenisSingleCommit()- Ob es sich um eine gezielte Aktualisierung einer einzigen Entität handeltgetFirstCommit()- Hilfsmethode, um die erste (oder einzige) Entität abzurufen
Für commit() ohne Parameter enthält das Ereignis alle Entitäten, die sich derzeit im Repository nach der Filterung befinden.
Aktualisierungsstrategien
Die beiden Commit-Signaturen dienen unterschiedlichen Zwecken:
// Aktualisierung einer einzelnen Entität - effizient für individuelle Änderungen
Customer customer = customers.get(0);
customer.setStatus("VIP");
repository.commit(customer);
// Massenaktualisierung - effizient für mehrere Änderungen
products.clear();
products.addAll(loadProductsFromCsv());
repository.commit();
Aktualisierungen einer einzelnen Entität sind chirurgisch - sie sagen den verbundenen Komponenten genau, welche Zeile sich geändert hat. Die Table kann nur die Zellen dieser Zeile aktualisieren, ohne etwas anderes zu berühren.
Massencommits aktualisieren alles. Verwenden Sie sie, wenn:
- Mehrere Entitäten verändert wurden
- Sie Artikel hinzugefügt oder entfernt haben
- Sie sich nicht sicher sind, was sich geändert hat
Reaktive UI-Muster
Repository-Ereignisse ermöglichen es Ihnen, Zusammenfassungsanzeigen mit Ihren Daten synchron zu halten:
// Automatisch aktualisierende Labels
repository.onCommit(event -> {
double total = sales.stream().mapToDouble(Sale::getAmount).sum();
totalLabel.setText(String.format("Gesamt: $%.2f", total));
countLabel.setText("Verkäufe: " + sales.size());
});
// Live-Ergebniszahlen
repository.onCommit(e -> {
long count = repository.findAll().count();
resultsLabel.setText(count + " Produkte gefunden");
});
Diese Listener werden bei jedem Commit aktiviert, ganz gleich, ob sie durch Benutzeraktionen, Datenimporte oder programmatische Aktualisierungen ausgelöst wurden. Das Ereignis gibt Ihnen Zugriff auf die bestätigten Entitäten, aber oft berechnen Sie erneut aus der Quellsammlung, um alle aktuellen Daten einzuschließen.
Speicherverwaltung
Ereignis-Listener halten Referenzen auf Ihre Komponenten. Wenn Sie diese nicht entfernen, behält das Repository Ihre Komponenten im Speicher, selbst wenn sie nicht mehr angezeigt werden:
// Referenz behalten, um später zu entfernen
ListenerRegistration<RepositoryCommitEvent<Data>> registration =
repository.onCommit(event -> {
updateDisplay(event.getCommits());
});
// Listener aufräumen, wenn die Komponente zerstört wird
if (registration != null) {
registration.remove();
}
Die Methode onCommit() gibt eine ListenerRegistration zurück. Speichern Sie diese Referenz und rufen Sie remove() auf, wenn Ihre Komponente zerstört wird oder keine Aktualisierungen mehr benötigt. Dies verhindert Speicherlecks in lang laufenden Anwendungen.