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 auf Änderungen hören, um benutzerdefinierte Logik auszulösen.

Repository-Ereignislebenszyklus

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

repository.onCommit(event -> {
// Alle kommittierten 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 gibt Ihnen folgende Informationen:

  • getCommits() - Liste der Entitäten, die kommittiert wurden
  • isSingleCommit() - Ob dies ein gezieltes Update einer einzelnen Entität war
  • getFirstCommit() - Hilfsmethode, um die erste (oder einzige) Entität zu erhalten

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

Aktualisierungsstrategien

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);

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

Commits von einzelnen Entitäten sind gezielt - sie sagen den verbundenen Komponenten genau, welche Zeile sich geändert hat. Der Table kann nur die Zellen dieser Zeile aktualisieren, ohne andere zu berühren.

Massencommits aktualisieren alles. Verwenden Sie sie, wenn:

  • Mehrere Entitäten geändert wurden
  • 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, Zusammenfassungen 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-Ergebnisanzahlen
repository.onCommit(e -> {
long count = repository.findAll().count();
resultsLabel.setText(count + " Produkte gefunden");
});

Diese Listener werden bei jedem Commit ausgelöst, egal ob durch Benutzeraktionen, Datenimporte oder programmatische Updates. Das Ereignis gibt Ihnen Zugriff auf die kommittierten Entitäten, aber oft berechnen Sie erneut aus der Quellsammlung, um alle aktuellen Daten einzuschließen.

Speicherverwaltung

Ereignis-Listener halten Referenzen zu Ihren Komponenten. Wenn Sie diese nicht entfernen, behält das Repository Ihre Komponenten im Speicher, auch 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 langlebigen Anwendungen.