Spring Data Java 8-Unterstützung

Spring Data Java 8-Unterstützung

1. Überblick

Spring Data unterstützt jetzt die wichtigsten Java 8-Funktionen wieOptional,Stream API undCompletableFuture.

In diesem kurzen Artikel werden einige Beispiele erläutert, wie wir diese mit dem Framework verwenden können.

2. Optional

Beginnen wir mit den CRUD-Repository-Methoden, die jetzt einOptional ergeben:

public interface CrudRepository extends Repository {

    Optional findById(ID id);

}

Wenn Sie eineOptional-Instanz zurückgeben, ist dies ein nützlicher Hinweis darauf, dass der Wert möglicherweise nicht vorhanden ist. Weitere Informationen zu Optional finden Sie unterhere.

Jetzt müssen wir nur noch den Rückgabetyp alsOptional angeben:

public interface UserRepository extends JpaRepository {

    Optional findOneByName(String name);

}

3. Stream API

Spring Data bietet auch Unterstützung für eine der wichtigsten Funktionen von Java 8 - dieStream-API.

In der Vergangenheit mussten wir immer dann, wenn wir mehr als ein Ergebnis zurückgeben mussten, eine Sammlung zurückgeben:

public interface UserRepository extends JpaRepository {
    // ...
    List findAll();
    // ...
}

Eines der Probleme bei dieser Implementierung war der Speicherverbrauch.

Wir mussten eifrig alle abgerufenen Objekte laden und aufbewahren.

Wir könnten uns verbessern, indem wir Paging nutzen:

public interface UserRepository extends JpaRepository {
    // ...
    Page findAll(Pageable pageable);
    // ...
}

In einigen Szenarien ist das ausreichend, in anderen jedoch ist die Paginierung aufgrund der hohen Anzahl von Anforderungen, die zum Abrufen der Daten erforderlich sind, nicht der richtige Weg.

Dank Java 8Stream API und JPA-Anbietern können wir jetztdefine that our repository method returns just a Stream of objects:

public interface UserRepository extends JpaRepository {
    // ...
    Stream findAllByName(String name);
    // ...
}

Spring Data verwendet eine anbieterspezifische Implementierung, um das Ergebnis zu streamen (Hibernate verwendetScrollableResultSet, EclipseLink verwendetScrollableCursor). Dies reduziert den Speicherverbrauch und das Abfragen von Aufrufen an eine Datenbank. Aus diesem Grund ist es auch viel schneller als zwei zuvor erwähnte Lösungen.

Processing data with a Stream requires us to close a Stream when we finish it.

Dies kann durch Aufrufen der Methodeclose() fürStream oder durch Verwendung vontry-with-resources erfolgen:

try (Stream foundUsersStream
  = userRepository.findAllByName(USER_NAME_ADAM)) {

assertThat(foundUsersStream.count(), equalTo(3l));

We must also remember to call a repository method within a transaction. Andernfalls erhalten wir eine Ausnahme:

org.springframework.dao.InvalidDataAccessApiUsageException: Sie versuchen, eine Streaming-Abfragemethode ohne eine umgebende Transaktion auszuführen, die die Verbindung offen hält, damitStream tatsächlich verbraucht werden kann. Stellen Sie sicher, dass der Code, der den Stream verbraucht,@Transactional oder eine andere Methode zum Deklarieren einer (schreibgeschützten) Transaktion verwendet.

4. CompletableFuture

Spring Data repositories can run asynchronously with the support of Java 8’s CompletableFuture und Spring-Mechanismus für die Ausführung asynchroner Methoden:

@Async
CompletableFuture findOneByStatus(Integer status);

Ein Client, der diese Methode aufruft, gibt sofort ein Future zurück, aber eine Methode setzt die Ausführung in einem anderen Thread fort.

Weitere Informationen zur Verarbeitung vonCompletableFuturefinden Sie unterhere.

5. Fazit

In diesem Tutorial haben wir gezeigt, wie Java 8-Funktionen mit Spring Data zusammenarbeiten.

Die vollständige Implementierung der Beispiele ist inover on Github verfügbar.