Zum Hauptinhalt springen

Ereignisse und Updates 24.00

In ChatGPT öffnen

Repository-Ereignisse ermöglichen es Ihnen, auf Datenänderungen zu reagieren. Neben den automatischen UI-Updates können Sie Änderungen überwachen, um benutzerdefinierte Logik auszulösen.

Repository-Ereignislebenszyklus

Jeder commit()-Aufruf löst ein RepositoryCommitEvent aus. Dieses Ereignis trägt Informationen darüber, was sich geändert hat:

repository.onCommit(event -> {
// Alle eingereichten Entitäten abrufen
List<Customer> commits = event.getCommits();

// Überprüfen, ob es sich um ein Update einer einzelnen Entität handelt
if (event.isSingleCommit()) {
Customer updated = event.getFirstCommit();
System.out.println("Aktualisiert: " + updated.getName());
}
});

Das Ereignis teilt Ihnen mit:

  • getCommits() - Liste der eingereichten Entitäten
  • isSingleCommit() - Ob es sich um ein gezieltes Update einer einzelnen Entität handelt
  • getFirstCommit() - Bequemlichkeitsmethode, um die erste (oder einzige) Entität abzurufen

Für commit() ohne Parameter enthält das Ereignis alle Entitäten, die sich nach der Filterung derzeit im Repository befinden.

Update-Strategien

Die beiden Commit-Signaturen dienen unterschiedlichen Zwecken:

// Update einer einzelnen Entität - effizient für individuelle Änderungen
Customer customer = customers.get(0);
customer.setStatus("VIP");
repository.commit(customer);

// Bulk-Update - effizient für mehrere Änderungen
products.clear();
products.addAll(loadProductsFromCsv());
repository.commit();

Commits für einzelne Entitäten sind chirurgisch - sie teilen den verbundenen Komponenten genau mit, welche Zeile sich geändert hat. Der Table kann nur die Zellen dieser Zeile aktualisieren, ohne etwas anderes zu berühren.

Bulk-Commits aktualisieren alles. Verwenden Sie sie, wenn:

  • Mehrere Entitäten sich geändert haben
  • Sie Elemente 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());
});

// Aktuelle Ergebniszahlen
repository.onCommit(e -> {
long count = repository.findAll().count();
resultsLabel.setText(count + " Produkte gefunden");
});

Diese Listener werden bei jedem Commit ausgelöst, unabhängig davon, ob es sich um Benutzeraktionen, Datenimporte oder programmatische Updates handelt. Das Ereignis gibt Ihnen Zugriff auf die eingereichten Entitäten, aber oft werden Sie die Berechnung aus der Quellsammlung neu durchführen, um alle aktuellen Daten einzubeziehen.

Speichermanagement

Ereignis-Listener halten Referenzen auf Ihre Komponenten. Wenn Sie sie nicht entfernen, behält das Repository Ihre Komponenten im Speicher, selbst nachdem sie nicht mehr angezeigt werden:

// Referenz behalten, um sie später zu entfernen
ListenerRegistration<RepositoryCommitEvent<Data>> registration =
repository.onCommit(event -> {
updateDisplay(event.getCommits());
});

// Listener bereinigen, wenn die Komponente zerstört wird
if (registration != null) {
registration.remove();
}

Die Methode onCommit() gibt eine ListenerRegistration zurück. Bewahren Sie diese Referenz auf und rufen Sie remove() auf, wenn Ihre Komponente zerstört wird oder keine Updates mehr benötigt. Dies verhindert Speicherlecks in langfristig laufenden Anwendungen.