Dienstag, 7. April 2026

Vaadin TreeGrid Spalten definieren

 Das ist der klassische Moment, in dem man von einer "In-Memory"-Liste zu einer echten Datenbank-Anbindung wechselt. Vaadin selbst ist nur das Frontend-Framework; es kümmert sich nicht darum, wo die Daten liegen, solange du sie ihm gibst.

In der Java-Welt (und besonders mit Spring Boot, was bei Vaadin Standard ist) nutzt man dafür meist Spring Data JPA.

Hier ist der Schlachtplan, um deine Daten "haltbar" zu machen:

1. Die Entity markieren

Deine Klasse (z. B. Department) braucht Annotationen, damit die Datenbank weiß, wie sie die Tabelle anlegen soll.

Java
@Entity
public class Department {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @ManyToOne
    private Department parent; // Wichtig für das TreeGrid!

    @OneToMany(mappedBy = "parent", fetch = FetchType.EAGER)
    private List<Department> subDepartments;

    // Getter, Setter, Konstruktoren...
}

2. Das Repository erstellen

Das ist dein "Interface" zur Datenbank. Spring erledigt das Speichern und Laden fast automatisch für dich.

Java
@Repository
public interface DepartmentRepository extends JpaRepository<Department, Long> {
    // Findet alle Wurzel-Elemente (die keinen Parent haben)
    List<Department> findByParentIsNull();
}

3. Ein Service für die Logik

Erstelle eine Klasse, die das Repository nutzt. Hier kannst du auch die Hierarchie-Logik für das TreeGrid abbilden.

Java
@Service
public class DepartmentService {
    private final DepartmentRepository repository;

    public DepartmentService(DepartmentRepository repository) {
        this.repository = repository;
    }

    public List<Department> findAllRoot() {
        return repository.findByParentIsNull();
    }

    public List<Department> findChildren(Department parent) {
        // Hier könntest du auch direkt repository.findByParent(parent) nutzen
        return parent.getSubDepartments();
    }

    public void save(Department dept) {
        repository.save(dept);
    }
}

4. Das TreeGrid mit dem Service verbinden

In deiner View injizierst du den Service und nutzt ihn beim Laden und beim Speichern im Kontextmenü.

Java
// Im Konstruktor deiner View
treeGrid.setItems(
    service.findAllRoot(), 
    service::findChildren
);

// Im Kontextmenü (Speichern-Beispiel)
contextMenu.addItem("Speichern", e -> {
    e.getItem().ifPresent(item -> {
        item.setName("Neuer Name");
        service.save(item); // <--- JETZT bleibt es auch nach dem Neustart da!
        treeGrid.getDataProvider().refreshItem(item);
    });
});

5. Die Datenbank-Konfiguration

Damit die Daten nicht nur im RAM liegen, musst du in der src/main/resources/application.properties eine Datenbank angeben.

  • Für den Start (H2-Datei): Die Daten werden in eine Datei auf der Festplatte geschrieben.

    Properties
    spring.datasource.url=jdbc:h2:file:./data/mydb
    spring.jpa.hibernate.ddl-auto=update
    
  • Für "echte" Projekte: Nutze PostgreSQL, MariaDB oder MySQL.


Was passiert beim Neustart?

Mit spring.jpa.hibernate.ddl-auto=update prüft Spring beim Start, ob die Tabelle existiert. Da die spring.datasource.url nun auf eine Datei zeigt (statt nur im Arbeitsspeicher zu leben), lädt Vaadin beim nächsten Mal genau das, was du vorher mit repository.save() reingeschrieben hast.

Möchtest du, dass ich dir ein Beispiel zeige, wie man ein Formular neben das TreeGrid baut, um neue Daten sauber einzugeben und zu speichern?

Keine Kommentare:

Kommentar veröffentlichen