Vous pouvez en savoir plus sur le cours en consultant le compte rendu de la journée portes ouvertes .
Spring Data Neumann est la premiÚre version depuis la transition vers un nouveau cycle de publication de six mois. Réduire le temps entre les versions nous permettra de publier de nouvelles fonctionnalités plus souvent, ce qui, à son tour, vous accélérera également. Dans cette version, en plus des nouvelles fonctionnalités, il y a également des changements importants qui peuvent potentiellement rompre la compatibilité avec les versions précédentes.
Changement de versions majeures
Pour les projets répertoriés ci-dessous, le numéro de version majeur a été augmenté en raison de modifications qui interrompent la compatibilité dans les API ou les pilotes publics:
- Spring Data JDBC 2.0 (version précédente 1.1)
- La migration de 1.1 vers 2.0 est décrite dans cet article .
- Spring Data MongoDB 3.0 (version précédente 2.2)
- Spring Data pour Apache Cassandra 3.0 (version précédente 2.2)
- Spring Data Couchbase 4.0 (version précédente 3.2)
- Spring Data Elasticsearch 4.0 (version précédente 3.2)
- Voir cet article pour plus de détails sur les changements .
Avant de passer à la description de la nouvelle fonctionnalité, examinons les modifications apportées à l'API. Pour plus de détails, consultez les sections Mise à niveau dans la documentation des modules respectifs.
Si vous n'ĂȘtes pas prĂȘt Ă mettre Ă jour maintenant, gardez Ă l'esprit que la version prĂ©cĂ©dente de Moore sera prise en charge pendant encore douze mois.
JDBC
Chaque stockage SQL a ses propres caractéristiques qui nécessitent une approche particuliÚre. Pour améliorer leur support, des modifications ont été apportées qui ont influencé l'augmentation de la version majeure. Maintenant,
AbstractJdbcConfiguration
par défaut, il essaie d'identifier les Dialect
bases de données à partir de données DataSource
ou enregistrées DialectResolver
. Par défaut, le module JDBC est livré avec des dialectes pour H2, HSQLDB, MySQL, Postgres, MariaDB, Microsoft SqlServer et DB2. Spring Data JDBC échappe désormais tous les noms de table et de colonne par défaut. Bien que cela puisse vous amener à modifier les vÎtres CREATE TABLE
ou les annotations @Column
, cela vous donnera plus de flexibilité pour nommer les objets.
MongoDB
Le bocal unique avec les pilotes pour MongoDB (mongo-java-driver) est divisĂ© en plusieurs: -sync et -reactivestreams, ce qui vous permet de sĂ©lectionner uniquement le pilote dont vous avez besoin. Autrement dit, les pilotes MongoDB synchrones et rĂ©actifs sont dĂ©sormais des dĂ©pendances facultatives qui doivent ĂȘtre ajoutĂ©es manuellement. Avec la migration vers de nouveaux pilotes, certaines des API dĂ©jĂ obsolĂštes ont Ă©tĂ© dĂ©finitivement supprimĂ©es, affectant les classes de configuration telles que les
AbstractMongoConfiguration
espaces de noms XML fournis par Spring Data. Consultez la section mise à niveau dans la documentation pour plus de détails .
Apache Cassandra
La mise à jour attendue depuis longtemps des pilotes Apache Cassandra vers 4.0 met non seulement à jour le package et la structure des données, mais modifie également le comportement dans le cluster et dans la gestion des sessions. Cela a conduit à des changements de configuration majeurs qui affectent la configuration XML et peuvent affecter la configuration dans le code pour certains scénarios complexes (plus difficiles qu'un simple paramÚtre par défaut
AbstractCassandraConfiguration
).
Couchbase
Suite au SDK Couchbase, nous sommes passés de la version 3.x à 4.x, qui a ajouté la gestion automatique des index et la prise en charge des transactions. En savoir plus sur le blog Couchbase .
Elasticsearch
Ajout de la prise en charge de l'API client HTTP, SSL et proxy. Un certain nombre de modifications ont également été apportées, notamment l'optimisation et la suppression de l'API obsolÚte, qui ont influencé le changement du numéro de version principal. Le module Elasticsearch inclut désormais Document, qui inclut
Get-
, Index-
et Search-Requests
, qui vous permet d'utiliser des types tels que SearchHit
, SearchHits
et SearchPage
.
Passons maintenant aux innovations.
Référentiels avec prise en charge des coroutines Kotlin
La version Neumann continue de s'appuyer sur la prise en charge des coroutines Kotlin qui a commencé dans la version précédente de Moore en ajoutant leur prise en charge dans les référentiels.
Les coroutines sont gĂ©rĂ©es via des rĂ©fĂ©rentiels Spring Data rĂ©actifs. Vous pouvez dĂ©sormais utiliser des mĂ©thodes de requĂȘte rĂ©actives ou Ă©crire vos propres fonctions suspendues.
interface StudentRepository : CoroutineCrudRepository<Student, String> {
suspend fun findOne(id: String): User
fun findByLastname(firstname: String): Flow<Student>
}
@Primary
-repositories et le mot-clé "recherche"
Ces deux petits changements amĂ©liorent la rĂ©cupĂ©ration des beans de rĂ©fĂ©rentiel et la dĂ©nomination des mĂ©thodes de requĂȘte. DĂ©sormais, l'annotation
@Primary
sur les rĂ©fĂ©rentiels d'interface est prise en compte dans la configuration du bean, ce qui aide le conteneur Ă rĂ©soudre les dĂ©pendances. Vous pouvez dĂ©sormais utiliser un prĂ©fixe pour les mĂ©thodes de requĂȘte "search"
, de la mĂȘme maniĂšre "find"
. Il est maintenant possible d'écrire des méthodes "search...By..."
, par exemple searchByFirstname
.
Bien que cela ait été fait pour des bases de données comme Elasticsearch, passons à autre chose et voyons comment
search...By...
vous pouvez utiliser R2DBC dans Spring Data.
GĂ©nĂ©ration de requĂȘtes R2DBC
Jusqu'à présent, Spring Data R2DBC a utilisé l'annotation
@Query
pour les mĂ©thodes de requĂȘte , Ă l'exception des mĂ©thodes par dĂ©faut exposĂ©es via les interfaces *.Repository
. La gĂ©nĂ©ration de requĂȘtes par nom de mĂ©thode fonctionne dĂ©sormais de la mĂȘme maniĂšre que les autres modules:
interface StudentRepository extends ReactiveCrudRepository<Student, Long> {
Flux<Student> searchByLastname(String lastname); (1)
}
Cela Ă©quivaut Ă :
@Query("select id, firstname, lastname from customer c where c.lastname = :lastname")
Pagination et gĂ©nĂ©ration de requĂȘtes pour JDBC
Spring Data JDBC 2.0 prend en charge encore plus de bases de données relationnelles. Nous exécutons maintenant nos tests d'intégration sur H2, HSQLDB, MySQL, MariaDB, PostgreSQL et DB2.
Pour ces bases de donnĂ©es, nous prenons en charge la gĂ©nĂ©ration et la pagination de requĂȘtes. Par exemple:
interface StudentRepository extends PagingAndSortingRepository<Student, Long> {
Page<Student> findByLastname(String lastname);
}
Dans cette version, nous continuons également à évoluer vers NoSQL, en commençant par MongoDB et une nouvelle façon de modifier les documents.
Agrégations de mise à jour MongoDB
Ce changement important (qui n'était pas entiÚrement préparé dans la version Moore) permet d'utiliser le pipeline d'agrégation pour mettre à jour les données. Ainsi, les modifications peuvent contenir des expressions complexes telles que des conditions sur les valeurs de champ, par exemple:
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();
De plus, Spring Data MongoDB bénéficiera sans aucun doute de la prise en charge récemment ajoutée des objets intégrés dans d'autres modules.
Prise en charge des types intégrés dans Apache Cassandra
Apache Cassandra prend désormais en charge le mappage de type intégré, qui est depuis longtemps disponible dans Spring Data JDBC . Dans le modÚle de domaine, les objets intégrés sont utilisés pour les objets de valeur dont les propriétés sont stockées dans une seule table. Dans l'exemple suivant,
Student.name
il existe une annotation au-dessus du champ @Embedded
, ce qui entraĂźne le Name
stockage de tous les champs de la classe dans une table Student
composée de trois colonnes ( student_id
, firstname
et 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;
}
Audit Elasticsearch
Ătant donnĂ© que dans ElasticSearch, la prĂ©sence n'est
id
pas un critÚre suffisant pour déterminer si un objet est nouveau, il est nécessaire de Persistable
fournir des informations supplémentaires lors de l'implémentation en utilisant la méthode 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);
}
}
L'ajout
@EnableElasticsearchAuditing
Ă la configuration enregistre ensuite tous les composants requis pour l'audit.
Neo4j
Spring Data Neo4j prend dĂ©sormais en charge la syntaxe de requĂȘte Neo4j 4.0 avec paramĂštres. La syntaxe d'espace rĂ©servĂ© Ă©tait auparavant obsolĂšte et est dĂ©sormais complĂštement supprimĂ©e. Le module s'appuie dĂ©sormais sur les derniers pilotes Java Neo4j-OGM et Neo4j pour amĂ©liorer l'interopĂ©rabilitĂ© avec le dernier Neo4j.
Il y a Ă©galement un travail actif sur la prise en charge de la rĂ©activitĂ© pour les bases de donnĂ©es graphiques et son intĂ©gration dans Spring Data avec Neo4j RX (bien que cela ne soit pas inclus dans la version actuelle, il est dĂ©jĂ prĂȘt pour ĂȘtre inclus dans la prochaine).
Apache Geode / VMware Tanzu GemFire
Les modules Spring Data pour Apache Geode et VMware Tanzu GemFire ââ(
spring-data-geode
et spring-data-gemfire
) sont combinĂ©s en un seul projet sous le titre SDG. Apache Geode a Ă©tĂ© mis Ă jour vers 1.12.0 et GemFire ââvers 9.10.0, qui Ă son tour est basĂ© sur Apache Geode 1.12. De plus, le SDG se compile et s'exĂ©cute sur les versions 8 Ă 14. du JDK. Le
SDG prend dĂ©sormais en charge la publication d'Ă©vĂ©nements de transaction automatique, qui mappe le Cache TransactionEvent du GemFire ââ/ Geode Cache Ă l'ApplicationEvent appropriĂ© dans le contexte.
Il est Ă©galement dĂ©sormais possible de suspendre l'envoi d'Ă©vĂ©nements sur un AEQ configurĂ© avec SDG. De plus, lors de la crĂ©ation d'applications basĂ©es sur GemFire ââ/ Geode Locator Ă l'aide de l'annotation SDG,
@LocatorApplication
vous pouvez personnaliserLocator pour se connecter à d'autres localisateurs , créant ainsi un cluster hautement disponible et résilient.
En savoir plus sur le cours.