Pull to refresh
1047.95
OTUS
Цифровые навыки от ведущих экспертов

Что нового в Spring Data (Klara Dan von) Neumann

Reading time6 min
Views2.6K
Original author: Christoph Strobl
Перевод статьи подготовлен в преддверии старта курса «Разработчик на Spring Framework».

Подробнее о курсе можно узнать посмотрев запись дня открытых дверей.





Spring Data Neumann — это первый релиз, после перехода на новый шестимесячный релизный цикл. Сокращение сроков между релизами позволит нам чаще выпускать новые фичи, а это, в свою очередь, ускорит и вас. В этом релизе, помимо нового функционала, есть также важные изменения, потенциально ломающие совместимость с предыдущими версиями.

Изменение мажорных версий


Для проектов, указанных ниже, увеличен номер мажорной версии из-за изменений, ломающих совместимость в публичных API или драйверах:

  • Spring Data JDBC 2.0 (предыдущая версия 1.1)
  • Миграция с 1.1 на 2.0 описана в этом посте.
  • Spring Data MongoDB 3.0 (предыдущая версия 2.2)
  • Spring Data для Apache Cassandra 3.0 (предыдущая версия 2.2)
  • Spring Data Couchbase 4.0 (предыдущая версия 3.2)
  • Spring Data Elasticsearch 4.0 (предыдущая версия 3.2)
  • Подробнее об изменениях см. этом посте.

Перед тем как перейти к описанию новой функциональности, давайте посмотрим на изменения в API. Подробнее об этом смотрите в разделах по обновлению (“Upgrading”) в документации соответствующих модулей.

Если вы не готовы обновляться сейчас, то имейте в виду, что предыдущий релиз Moore будет поддерживаться еще в течение двенадцати месяцев.

JDBC


У каждого SQL-хранилища есть свои особенности, требующие особого подхода. Для улучшения их поддержки были внесены изменения, которые повлияли на увеличение мажорной версии. Теперь AbstractJdbcConfiguration по умолчанию пытается определить Dialect базы данных из заданного DataSource или зарегистрированного DialectResolver. По умолчанию модуль JDBC поставляется с диалектами для H2, HSQLDB, MySQL, Postgres, MariaDB, Microsoft SqlServer и DB2. Spring Data JDBC теперь по умолчанию экранирует все имена таблиц и колонок. Несмотря на то что из-за этого вам, возможно, придется изменить ваши CREATE TABLE или аннотации @Column, это даст большую гибкость при именовании объектов.

MongoDB


Единый jar с драйверами для MongoDB (mongo-java-driver) разбит на несколько: -sync и -reactivestreams, что позволяет вам выбрать только необходимый драйвер. То есть, и синхронный, и реактивный драйверы MongoDB теперь являются необязательными зависимостями, которые необходимо добавлять вручную. При переходе на новые драйвера некоторые из уже устаревших API были окончательно удалены, что повлияло на классы конфигурации, такие как AbstractMongoConfiguration и пространства имен XML, предоставляемые Spring Data. Подробнее смотрите раздел по обновлению в документации.

Apache Cassandra


Давно назревшее обновление драйверов Apache Cassandra до 4.0 не только обновляет пакет и структуру данных, но также изменяет поведение в кластере и в обработке сеансов. Это привело к серьезным изменениям в конфигурации, которые влияют на XML-конфигурацию и могут повлиять на конфигурацию в коде для каких-то сложных сценариев (сложнее, чем простая настройка по умолчанию AbstractCassandraConfiguration).

Couchbase


Вслед за Couchbase SDK мы обновились с версии 3.x до 4.x, что добавило автоматическое управление индексами и поддержку транзакций. Подробнее читайте в блоге Couchbase.

Elasticsearch


Добавлена поддержка HTTP Client API, SSL и Proxy. Также сделан ряд изменений, включающих в себя оптимизацию и удаление устаревшего API, что повлияло на изменение мажорного номера версии. В модуль Elasticsearch теперь входит Document, включающий в себя Get-, Index- и Search-Requests, что позволяет при маппинге использовать такие типы как SearchHit, SearchHits и SearchPage.

Теперь давайте перейдем к новшествам.

Репозитории с поддержкой корутин Kotlin


Релиз Neumann продолжает развитие поддержки корутин Kotlin, начавшуюся в предыдущем релизе Moore, добавив их поддержку в репозиториях.

Корутины поддерживаются через реактивные Spring Data-репозитории. Теперь можно использовать реактивные методы запросов или писать свои suspended-функции.

interface StudentRepository : CoroutineCrudRepository<Student, String> {
    suspend fun findOne(id: String): User
    fun findByLastname(firstname: String): Flow<Student>
}

@Primary-репозитории и ключевое слово “search”


Эти два небольших изменения улучшают поиск бинов репозиториев и именование методов запросов. Теперь аннотация @Primary на репозиториях-интерфейсах учитывается в конфигурации бинов, что помогает контейнеру резолвить зависимости. Для методов запросов теперь можно использовать префикс "search", аналогично "find". То есть теперь можно писать методы "search...By...", например, searchByFirstname.

Несмотря на то что это было сделано для таких баз данных, как Elasticsearch, давайте двигаться дальше и посмотрим как search...By... можно использовать в Spring Data R2DBC.

Генерация запросов R2DBC


До настоящего времени в Spring Data R2DBC для методов запросов использовалась аннотация @Query за исключением методов по умолчанию, предоставляемых через интерфейсы *.Repository. Теперь генерация запросов по имени метода работает аналогично другим модулям:

interface StudentRepository extends ReactiveCrudRepository<Student, Long> {

	Flux<Student> searchByLastname(String lastname); (1)
}

Это эквивалентно:

@Query("select id, firstname, lastname from customer c where c.lastname = :lastname")

Разбивка на страницы и генерация запросов для JDBC


Spring Data JDBC 2.0 поддерживает еще больше реляционных баз данных. Теперь мы запускаем наши интеграционные тесты на H2, HSQLDB, MySQL, MariaDB, PostgreSQL и DB2.

Для этих баз данных мы поддерживаем генерацию запросов и разбивку на страницы. Например:

interface StudentRepository extends PagingAndSortingRepository<Student, Long> {

	Page<Student> findByLastname(String lastname);
}

В этом релизе мы также продолжаем двигаться в сторону NoSQL, начав с MongoDB и нового способа модификации документов.

MongoDB Update Aggregations


Это важное изменение (которое не было полностью готово в релизе Moore) позволяет использовать Aggregation Pipeline для обновления данных. Таким образом, изменения могут содержать сложные выражения, такие как условия по значениям полей, например:

AggregationUpdate update = Aggregation.newUpdate()
    .set("average").toValue(ArithmeticOperators.valueOf("tests").avg())
    .set("grade").toValue(ConditionalOperators.switchCases(
        when(valueOf("average").greaterThanEqualToValue(90)).then("A"),
        when(valueOf("average").greaterThanEqualToValue(80)).then("B"),
        when(valueOf("average").greaterThanEqualToValue(70)).then("C"),
        when(valueOf("average").greaterThanEqualToValue(60)).then("D"))
        .defaultTo("F")
    );

template.update(Student.class)
    .apply(update)
    .all();

Также Spring Data MongoDB, несомненно, выиграет от недавно добавленной в другие модули поддержки встроенных объектов (embedded object).

Поддержка embedded-типов в Apache Cassandra


Apache Cassandra теперь поддерживает маппинг встроенных типов (embedded type), которые уже давно были доступны в Spring Data JDBC. В модели предметной области встроенные объекты используются для объектов-значений (Value Object), свойства которых хранятся в одной таблице. В следующем примере над полем Student.name стоит аннотация @Embedded, что приводит к тому, что все поля класса Name будут храниться в таблице Student, состоящей из трех столбцов (student_id, firstname и lastname):

public class Student {

    @PrimaryKey("student_id")
    private String studentId;

    @Embedded(onEmpty = USE_NULL)
    Name name;
}

public class Name {
    private String firstname;
    private String lastname;
}

Аудит в Elasticsearch


Поскольку в ElasticSearch наличие id не является достаточным критерием для определения того, является ли объект новым, необходимо при реализации Persistable предоставить дополнительную информацию с помощью метода isNew():

@Document(indexName = "person")
public class Person implements Persistable<Long> {

    @Id private Long id;
    private String lastName;
    private String firstName;

    @Field(type = Date)
    private Instant createdDate;
    private String createdBy

    @Field(type = Date)
    private Instant lastModifiedDate;
    private String lastModifiedBy;

    @Override
    public boolean isNew() {
        return id == null || (createdDate == null && createdBy == null);
    }
}

После этого добавление @EnableElasticsearchAuditing в конфигурацию регистрирует все компоненты, необходимые для аудита.

Neo4j


Spring Data Neo4j теперь поддерживает синтаксис запросов Neo4j 4.0 с параметрами. Синтаксис с заполнителями (placeholder) был ранее объявлен устаревшим, а сейчас полностью удален. Теперь модуль зависит от последних версий драйверов Neo4j-OGM и Neo4j Java для улучшения взаимодействия с последней версией Neo4j.

Также идет активная работа по поддержке реактивности для графовых баз данных и ее интеграция в Spring Data с Neo4j RX (хотя это и не входит в текущий релиз, но уже готово для включения в следующий).

Apache Geode / VMware Tanzu GemFire


Модули Spring Data для Apache Geode и VMware Tanzu GemFire (spring-data-geode и spring-data-gemfire) объединены в один проект под общим названием SDG. Apache Geode был обновлен до 1.12.0, а GemFire до 9.10.0, который, в свою очередь, основан на Apache Geode 1.12. Кроме того, SDG компилируется и запускается на версиях JDK с 8 по 14.

SDG теперь поддерживает публикацию событий автотранзакций, которая преобразует событие Cache TransactionEvent от GemFire / Geode Cache в соответствующий ApplicationEvent контекста.

Также теперь можно приостановить отправку событий на AEQ, настроенном с помощью SDG. Кроме того, при создании приложений на основе GemFire / Geode Locator с использованием аннотации SDG @LocatorApplication можно настроить Locator для подключения к другим Locator, создавая таким образом высокодоступный и устойчивый кластер.



Узнать подробно о курсе.



Читать ещё


Tags:
Hubs:
Total votes 10: ↑7 and ↓3+4
Comments0

Articles

Information

Website
otus.ru
Registered
Founded
Employees
101–200 employees
Location
Россия
Representative
OTUS