[Программирование, Java] Что нового в Spring Data (Klara Dan von) Neumann (перевод)
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Перевод статьи подготовлен в преддверии старта курса «Разработчик на 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, создавая таким образом высокодоступный и устойчивый кластер.
Узнать подробно о курсе.
Читать ещё:
- Spring Boot — OAuth2 и JWT
- Введение в Spring Boot Actuator
- Паттерны проектирования, используемые в Spring Framework
===========
Источник:
habr.com
===========
===========
Автор оригинала: Christoph Strobl
===========Похожие новости:
- [Программирование, .NET, C#] Битва C# JSON сериализаторов для .NET Core 3 (перевод)
- [Разработка веб-сайтов, PHP, Программирование, Проектирование и рефакторинг] Модернизация старого PHP-приложения (перевод)
- [Информационная безопасность, Разработка веб-сайтов, JavaScript] Как npm обеспечивает безопасность
- [Go, Программирование] Конвертация целых чисел в interface{} в Go 1.15
- [Информационная безопасность, Реверс-инжиниринг, Программирование микроконтроллеров, Производство и разработка электроники] Реверс embedded: трассировка кода через SPI-flash
- [PostgreSQL, Программирование, SQL, Администрирование баз данных] PostgreSQL Antipatterns: уникальные идентификаторы
- [Работа с 3D-графикой, Дизайн, Умный дом, Интернет вещей, DIY или Сделай сам] Электронные часы в духе Cronixie
- [Open source, Программирование, Rust] Закладывая фундамент будущего Rust (перевод)
- [Разработка веб-сайтов, PHP, Программирование, Проектирование и рефакторинг] Мёртвый код: найти и обезвредить
- [Open source, JavaScript, Canvas] Collage_n простой онлайн редактор для создания коллажей и эффектов на javascript
Теги для поиска: #_programmirovanie (Программирование), #_java, #_spring_framework, #_spring_data, #_blog_kompanii_otus._onlajnobrazovanie (
Блог компании OTUS. Онлайн-образование
), #_programmirovanie (
Программирование
), #_java
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 21:53
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Перевод статьи подготовлен в преддверии старта курса «Разработчик на Spring Framework». Подробнее о курсе можно узнать посмотрев запись дня открытых дверей. Spring Data Neumann — это первый релиз, после перехода на новый шестимесячный релизный цикл. Сокращение сроков между релизами позволит нам чаще выпускать новые фичи, а это, в свою очередь, ускорит и вас. В этом релизе, помимо нового функционала, есть также важные изменения, потенциально ломающие совместимость с предыдущими версиями.
Изменение мажорных версий Для проектов, указанных ниже, увеличен номер мажорной версии из-за изменений, ломающих совместимость в публичных API или драйверах:
Перед тем как перейти к описанию новой функциональности, давайте посмотрим на изменения в 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, создавая таким образом высокодоступный и устойчивый кластер. Узнать подробно о курсе. Читать ещё:
=========== Источник: habr.com =========== =========== Автор оригинала: Christoph Strobl ===========Похожие новости:
Блог компании OTUS. Онлайн-образование ), #_programmirovanie ( Программирование ), #_java |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 21:53
Часовой пояс: UTC + 5