Novedades de Spring Data (Klara Dan von) Neumann

La traducción del artículo se preparó antes del inicio del curso "Desarrollador en Spring Framework" .



Puede obtener más información sobre el curso consultando el registro de la jornada de puertas abiertas .










Spring Data Neumann es el primer lanzamiento desde la transición a un nuevo ciclo de lanzamiento de seis meses. Reducir el tiempo entre lanzamientos nos permitirá lanzar nuevas funciones con más frecuencia y esto, a su vez, también lo acelerará. En esta versión, además de la nueva funcionalidad, también hay cambios importantes que potencialmente rompen la compatibilidad con versiones anteriores.


Cambio de versiones principales



Para los proyectos que se enumeran a continuación, el número de versión principal se ha incrementado debido a cambios que rompen la compatibilidad en API o controladores públicos:



  • Spring Data JDBC 2.0 (versión anterior 1.1)
  • La migración de 1.1 a 2.0 se describe en esta publicación .
  • Spring Data MongoDB 3.0 (versión anterior 2.2)
  • Spring Data para Apache Cassandra 3.0 (versión anterior 2.2)
  • Spring Data Couchbase 4.0 (versión anterior 3.2)
  • Spring Data Elasticsearch 4.0 (versión anterior 3.2)
  • Para obtener más detalles sobre los cambios, consulte esta publicación .


Antes de pasar a describir la nueva funcionalidad, echemos un vistazo a los cambios en la API. Para obtener más detalles, consulte las secciones Actualización en la documentación de los módulos respectivos.



Si no está listo para actualizar ahora, tenga en cuenta que la versión anterior de Moore será compatible durante otros doce meses.



JDBC



Cada almacenamiento SQL tiene sus propias características que requieren un enfoque especial. Para mejorar su soporte, se realizaron cambios que afectaron el aumento en la versión principal. Ahora, AbstractJdbcConfigurationde forma predeterminada, intenta identificar las Dialectbases de datos dadas DataSourceo registradas DialectResolver. De forma predeterminada, el módulo JDBC viene con dialectos para H2, HSQLDB, MySQL, Postgres, MariaDB, Microsoft SqlServer y DB2. Spring Data JDBC ahora escapa a todos los nombres de tablas y columnas de forma predeterminada. Si bien esto puede hacer que cambie las suyas CREATE TABLEo las anotaciones @Column, esto le dará más flexibilidad para nombrar objetos.



MongoDB



El único jar con controladores para MongoDB (mongo-java-driver) se divide en varios: -sync y -reactivestreams, lo que le permite seleccionar solo el controlador que necesita. Es decir, tanto los controladores MongoDB síncronos como reactivos son ahora dependencias opcionales que deben agregarse manualmente. Con la migración a nuevos controladores, algunas de las API ya obsoletas se eliminaron de forma permanente, lo que afectó a las clases de configuración, como los AbstractMongoConfigurationespacios de nombres XML proporcionados por Spring Data. Consulte la sección de actualización en la documentación para obtener más detalles.



Apache Cassandra



La actualización largamente esperada de los controladores Apache Cassandra a 4.0 no solo actualiza el paquete y la estructura de datos, sino que también cambia el comportamiento en el clúster y en el manejo de sesiones. Esto ha llevado a cambios de configuración importantes que afectan la configuración XML y pueden afectar la configuración en el código para algunos escenarios complejos (más difíciles que una configuración predeterminada simple AbstractCassandraConfiguration).



Couchbase



Siguiendo el Couchbase SDK, actualizamos de la versión 3.xa 4.x, que agregó administración de índices automática y soporte para transacciones. Lea más en el blog de Couchbase .



Elasticsearch



Se agregó soporte para HTTP Client API, SSL y Proxy. También se realizaron varios cambios, incluida la optimización y eliminación de la API obsoleta, que influyó en el cambio en el número de versión principal. El módulo Elasticsearch ahora incluye Document, que incluye Get-, Index-y Search-Requests, que le permite usar tipos como SearchHit, SearchHitsy SearchPage.



Pasemos ahora a las innovaciones.



Repositorios con soporte para corrutinas Kotlin



La versión de Neumann continúa basándose en el soporte para las corrutinas de Kotlin que comenzó en la versión anterior de Moore al agregar soporte para ellas en los repositorios.



Las corrutinas se mantienen a través de repositorios reactivos de Spring Data. Ahora puede utilizar métodos de consulta reactivos o escribir sus propias funciones suspendidas.



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


@Primary-repositorios y la palabra clave "búsqueda"



Estos dos pequeños cambios mejoran la recuperación de beans de repositorio y la asignación de nombres a los métodos de consulta. Ahora, la anotación @Primaryen los repositorios de la interfaz se tiene en cuenta en la configuración del bean, lo que ayuda al contenedor a resolver las dependencias. Ahora puede usar un prefijo para los métodos de consulta "search", de manera similar "find". Ahora es posible escribir métodos "search...By...", por ejemplo searchByFirstname.



Aunque esto se hizo para bases de datos como Elasticsearch, sigamos adelante y veamos cómo search...By...puede usar R2DBC en Spring Data.



Generación de consultas R2DBC



Hasta ahora, Spring Data R2DBC ha usado anotaciones @Querypara métodos de consulta , excepto para los métodos predeterminados expuestos a través de interfaces *.Repository. Ahora, la generación de solicitudes por nombre de método funciona de manera similar a otros módulos:



interface StudentRepository extends ReactiveCrudRepository<Student, Long> {

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


Esto es equivalente a:



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


Paginación y generación de consultas para JDBC



Spring Data JDBC 2.0 admite aún más bases de datos relacionales. Ahora estamos ejecutando nuestras pruebas de integración en H2, HSQLDB, MySQL, MariaDB, PostgreSQL y DB2.



Para estas bases de datos, apoyamos la generación de consultas y la paginación. Por ejemplo:



interface StudentRepository extends PagingAndSortingRepository<Student, Long> {

	Page<Student> findByLastname(String lastname);
}


En esta versión, también continuamos avanzando hacia NoSQL, comenzando con MongoDB y una nueva forma de modificar documentos.



Agregaciones de actualización de MongoDB



Este importante cambio (que no se preparó por completo en la versión de Moore) permite que se utilice Aggregation Pipeline para actualizar datos. Por lo tanto, los cambios pueden contener expresiones complejas como condiciones en valores de campo, por ejemplo:



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();


Además, Spring Data MongoDB sin duda se beneficiará del soporte agregado recientemente para objetos incrustados en otros módulos.



Soporte para tipos incrustados en Apache Cassandra



Apache Cassandra ahora admite el mapeo de tipos incrustado, que ha estado disponible durante mucho tiempo en Spring Data JDBC . En el modelo de dominio, los objetos integrados se utilizan para los objetos de valor cuyas propiedades se almacenan en una sola tabla. En el siguiente ejemplo, Student.namehay una anotación sobre el campo @Embedded, que hace que todos los campos de la clase Namese almacenen en una tabla que Studentconsta de tres columnas ( student_id, firstnamey 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;
}


Auditoría de Elasticsearch



Dado que en ElasticSearch la existencia idno es un criterio suficiente para determinar si un objeto es nuevo, es necesario Persistableproporcionar información adicional durante la implementación utilizando el método 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);
    }
}


La adición @EnableElasticsearchAuditinga la configuración registra todos los componentes necesarios para la auditoría.



Neo4j



Spring Data Neo4j ahora admite la sintaxis de consulta de Neo4j 4.0 con parámetros. La sintaxis del marcador de posición estaba obsoleta anteriormente y ahora se ha eliminado por completo. El módulo ahora se basa en los últimos controladores Neo4j-OGM y Neo4j Java para mejorar la interoperabilidad con el último Neo4j.



También hay un trabajo activo para respaldar la reactividad para bases de datos de gráficos e integrarlo en Spring Data con Neo4j RX (aunque esto no está incluido en la versión actual, ya está listo para su inclusión en la próxima).



Apache Geode / VMware Tanzu GemFire



Los módulos de Spring Data para Apache Geode y VMware Tanzu GemFire ​​( spring-data-geodey spring-data-gemfire) se combinan en un proyecto bajo el título SDG. Apache Geode se ha actualizado a 1.12.0 y GemFire ​​a 9.10.0, que a su vez se basa en Apache Geode 1.12. Además, el SDG se compila y se ejecuta en las versiones 8 a 14 de JDK. El



SDG ahora admite la publicación de eventos de transacción automática, que mapea el Cache TransactionEvent del GemFire ​​/ Geode Cache al ApplicationEvent apropiado en el contexto.



Ahora también es posible pausar el envío de eventos en un AEQ configurado con SDG. Además, al crear aplicaciones basadas en GemFire ​​/ Geode Locator utilizando la anotación SDG, @LocatorApplicationpuede configurarLocalizador para conectarse a otros localizadores , creando así un clúster resistente y de alta disponibilidad.






Obtenga más información sobre el curso.






Lee mas






All Articles