Nouveautés de Spring Data (Klara Dan von) Neumann

La traduction de l'article a été préparée en prévision du début du cours "Developer on the Spring Framework" .



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, AbstractJdbcConfigurationpar défaut, il essaie d'identifier les Dialectbases de données à partir de données DataSourceou 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 TABLEou 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 AbstractMongoConfigurationespaces 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, SearchHitset 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 @Primarysur 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 @Querypour 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.nameil existe une annotation au-dessus du champ @Embedded, ce qui entraßne le Namestockage de tous les champs de la classe dans une table Studentcomposée de trois colonnes ( student_id, firstnameet 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 idpas un critĂšre suffisant pour dĂ©terminer si un objet est nouveau, il est nĂ©cessaire de Persistablefournir 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-geodeet 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, @LocatorApplicationvous pouvez personnaliserLocator pour se connecter Ă  d'autres localisateurs , crĂ©ant ainsi un cluster hautement disponible et rĂ©silient.






En savoir plus sur le cours.






Lire la suite






All Articles