Skip to content

Release Train 2021.1 (Q) Release Notes

Mark Paluch edited this page Nov 11, 2021 · 21 revisions

General Themes

Participating Modules

Details

New and Noteworthy

Spring Data Commons - 2.6

Support jMolecules' @Identity Annotation for Identifiers

Domain models can now use jMolecules' @Identity annotation to denote the identifier property of an aggregate root to improve developer experience when using jMolecules.

Fluent Query API for Querydsl and Query-by-Example

QuerydslPredicateExecutor, QueryByExampleExecutor and their reactive variants now define with findBy(…) a query method that allows fluent definition of queries. The fluent API allows customization of projections, sort properties and various terminal methods introducing consumption of results as Stream and other return types. Support for the fluent API is available in all store modules that already support Querydsl or Query by Example.

Publish Delete Events by Repository methods deleteInBatch and deleteAllInBatch

Repositories that support deleteInBatch and deleteAllInBatch methods now publish @DomainEvents when deleting multiple aggregates using batch functionality. From Spring Data’s core modules JPA is now supporting this functionality.

Support for Smallrye Mutiny

Repositories can now make use of Smallrye Mutiny types such as Uni and Multi in repository query methods. These types serve also as markers to detect whether a repository is a reactive one.

Deprecated RxJava 2 Support

RxJava 2 support is now deprecated for removal with Spring Data 3.0. RxJava 2 is end-of-life as of February 28, 2021 and we recommend using RxJava 3 instead.

Tickets

M3

  • #2438 - Support jMolecules' @Identity as ID annotation.

  • #2448 - Publish delete events by repository methods deleteInBatch and deleteAllInBatch methods.

RC1

  • #2228 - Add support for QueryDSL and Query by Example projections through a fluent API in repositories.

  • #2470 - Deprecate support for RxJava 2.

  • #2471 - Add Smallrye Mutiny support.

Spring Data JPA - 2.6

Introduction JpaRepositoryFactory.getRepositoryFragments(…) for easier customization of fragments

JpaRepositoryFactory.getRepositoryFragments(RepositoryMetadata, EntityManager, EntityPathResolver, CrudMethodMetadata) allows customization of fragments providing more contextual information without requiring reflective access to fields. The related ticket contains additional information.

Tickets

M1

  • #1959 - REF_CURSOR support for stored procedures.

  • #2202 - Introduce template method for easier customization of fragments.

Spring Data MongoDB - 3.3

Flexible document references

Using @DocumentReference offers a flexible way of referencing entities in MongoDB. Document references, do not follow a specific format. They can be literally anything, a single value, an entire document, basically everything that can be stored in MongoDB. By default, the mapping layer will use the referenced entities id value for storage and retrieval, like in the sample below:

class Account {
  @Id String id;
}

class Person {

  @Id String id;

  @DocumentReference List<Account> accounts;
}

Document references allow customizing lookup queries, the target database and collection name and much more. The reference documentation on document references explains how to use references in greater detail.

Add support for creating Time-Series Collection

MongoDB 5.0 introduced Time Series collections that are optimized to efficiently store documents over time such as measurements or events. Those collections need to be created as such before inserting any data. Collections can be created by either running the createCollection command, defining time series collection options or extracting options from a @TimeSeries annotation used on domain classes.

@TimeSeries(collection = "weather", timeField = "timestamp")
public class Measurement {
    String id;
    Instant timestamp;
    // ...
}

See the Spring Data MongoDB documentation for further reference.

Support for Wildcard Indexes

Wildcard indexes can be created programatically or declaratively. The annotation-driven declaration style covers various use-cases such as full-document indexes or indexes for maps. Consult the documentation for wildcard indexes to learn about the details.

Inclusion/Exclusion of null properties on write

Properties whose values is null were skipped when writing a Document from an entity. @Field(write=…) can now be used to control whether to skip (default) such properties or whether to force a null property to be written to the Document.

Schema Derivation for Encrypted Properties

MongoDB’s Client-Side Field-Level Encryption requires a schema map to let the driver transparently encrypt and decrypt fields of a document.To simplify the configuration. properties in the domain model can be annotated with @Encrypted. MongoJsonSchemaCreator can create the schema map for Mongo’s AutoEncryptionSettings based on the domain model. Schema generation considers the algorithm and key identifiers.

The documentation on Encrypted Fields explains the configuration in detail.

Tickets

M1

  • Add support for creating time series collection. #3731

  • Add support for flexible document references. #3602

  • Add support for Wildcard Indexes #3225

M2

M3

  • Add configuration support for MongoDB ServerApiVersion #3820

  • Add support for deriving json schema for encrypted properties. #3800

Spring Data Neo4j - 6.2

Support for cyclic mapping in projections

tbd.

Support for Querydsl

It is now possible to use Querydsl Predicates to run Cypher queries through QuerydslPredicateExecutor and its reactive variant ReactiveQuerydslPredicateExecutor. Querydsl predicates are translated to Cypher by leveraging the Cypher DSL API.

Spring Data Elasticsearch - 4.3

tbd.

Tickets

M1

  • #1767 - DynamicMapping annotation should be applicable to any object field.

  • #1454 - Allow disabling TypeHints.

  • #1787 - Search with MoreLikeThisQuery should use Pageable.

  • #1792 - Upgrade to Elasticsearch 7.12.1.

  • #1800 - Improve handling of immutable classes.

  • #1255 - Add pipeline aggregations to NativeSearchQuery.

  • #1816 - Allow runtime_fields to be defined in the index mapping.

  • #1831 - Upgrade to Elasticsearch 7.13.0.

  • #1839 - Upgrade to Elasticsearch 7.13.1.

  • #1862 - Add native support for range field types by using a range object.

  • #1864 - Upgrade to Elasticsearch 7.13.3.

M3

  • #1917 - Fix @Query method implementation for unpaged queries.

  • #1926 - Change mapping of connectionRequestTimeout to ConnPool leaseTimeout.

  • #1892 - Upgrade to Elasticsearch 7.14.

RC1

  • #1938 - Add @QueryAnnotation meta annotation to @Query.

  • #1941 - Upgrade to Elasticsearch 7.15.0.

  • #1909 - Add repository search for nullable or empty properties..

  • #1950 - AbstractElasticsearchTemplate.searchForStream use Query scrolltime.

  • #1945 - Enable custom converters for single fields .

  • #1911 - Supply a custom Sort.Order providing Elasticsearch specific parameters.

  • #769 - Support for field exclusion from source.

GA

  • #1971 - Add possibility to define runtime fields in a search request.

  • #1974 - Query setScrollTime not working on reactive search.

  • #1978 - Set RefreshPolicy parameter to the ElasticRestTemplate copy.

Spring Data Couchbase - 4.3

Spring Data for Apache Cassandra - 3.3

Refined IN querie bind marker computation

Queries using the IN relation in combination with bind markers use now a single parameter bind marker for efficient statement reuse when using prepared statements. Using a single bind marker avoids unrolling bound collections into multiple bind markers which make prepared statement caching depending on the actual parameters. This lead previously to increased memory usage.

Allow Java 16 records to be used for @PrimaryKeyClass

PrimaryKeyClassEntityMetadataVerifier which verifies mapping metadata for primary key types now no longer requires that primary key types subclass only java.lang.Object. Records use java.lang.Record as superclass so the subclass check is no longer applied. We encourage using records as composite primary keys for partitioning primary keys as those are not updateable in Cassandra itself.

Add overloads to CassandraBatchOperations.insert(…) accepting WriteOptions

It’s now possible to specify write options when using batch operations so you can customize TTL, timestamp and other options during batch writes.

Support configurable batch types for batch operations

Batch operations can be now configured for usage of Logged, Unlogged, or Counter batches by specifying the BatchType when obtaining CassandraBatchOperations. Previously, only Logged batches could be used.

Spring Data for Apache Geode - 2.6

tbd.

Spring Data Redis - 2.6

Support for Redis 6.2 commands

As of this version, you can use a wide range of Redis 6.2 commands such as LMOVE/BLMOVE, ZMSCORE, ZRANDMEMBER, HRANDFIELD, and many more. Refer to the 2.6.0-M1 Release Notes for a full list of introduced commands.

RedisURI-based configuration of LettuceConnectionFactory

LettuceConnectionFactory can now be configured by using a Lettuce RedisURI. This method creates a RedisConfiguration that can be then used to create LettuceConnectionFactory.

Configurable batching strategy for RedisCache

It’s now possible to configure a BatchStrategy for RedisCache. The batch strategy supports for now cache clearing using either KEYS or SCAN with a configurable batch size.

For example, the following will configure a non-locking CacheWriter with a SCAN batching strategy:

RedisCacheManagerBuilder.fromCacheWriter(RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory, BatchStrategies.scan(42)));

Refined MessageListener allowing to listen for subscribed/unsubscribed events

Support for SubscriptionListener when using MessageListener for subscription confirmation callbacks. ReactiveRedisMessageListenerContainer and ReactiveRedisOperations provide receiveLater(…) and listenToLater(…) methods to await until Redis acknowledges the subscription.

Tickets

M1

  • Redis 6.2 Command support

  • Redis Cache writer clean performance optimization #1721

M2

M3

  • Enable ReactiveRedisTemplate for multi-tenancy usage #2145

Spring Data KeyValue - 2.6

Extract QuerydslKeyValuePredicateExecutor to its own fragment

As a housekeeping task, we extracted QuerydslKeyValuePredicateExecutor into its own fragment. QuerydslKeyValueRepository, which subclasses SimpleKeyValueRepository and therefore limits composition flexibility is now deprecated. You should not be affected by this change unless you apply further customizations on Key-Value Querydsl support or you’re using QuerydslKeyValueRepository directly.

Spring Data REST - 3.6

M1

M2

Spring Data LDAP - 2.6

Add support for projection and Stream queries

LDAP repository query methods can now return Stream as return type and interface and DTO projections to be consistent with the remaining Spring Data portfolio.

Extract QuerydslLdapPredicateExecutor to its own fragment

As a housekeeping task, we extracted QuerydslPredicateExecutor into its own fragment. QuerydslLdapRepository, which subclasses SimpleLdapRepository and therefore limits composition flexibility is now deprecated. You should not be affected by this change unless you apply further customizations on Key-Value Querydsl support or you’re using QuerydslLdapRepository directly.

Spring Data JDBC - 2.3

Streaming large result sets

JDBC repository query methods can now return Stream to stream large result sets directly from a ResultSet instead of collecting results into a List to reduce memory pressure and latency until the first result.

interface PersonRepository extends CrudRepository<Person, Long> {

	@Query("SELECT * FROM person WHERE name  < :upper and name > :lower")
	Stream<Person> findAsStream(String lower, String upper);
}

Projection support

Repository query methods now can return projections using either interface- or DTO projections including dynamic projections. Note that projections cannot be used when specifying a custom RowMapper.

Driver-specific simple types

It is now possible to use driver-specific types in domain objects that are translated to SQL values. Simple types are not translated to entities, instead their value is passed on as-is for both, reading and writing. As of this release, you can use PGobject with the Postgres driver and register your own types through dialects if you wish to do so.

SQL Builder refinements

The SQL builder usage is growing beyond its intended goal to serve as internal SQL abstraction for Spring Data JDBC and R2DBC. Based on that demand, Conditions can now be used in JOIN expressions and SELECT projections. The JOIN builder also now accepts subselects for select-based joining of rows.

Deprecation of AfterLoadEvent in favor of AfterConvertEvent

In the Spring Data portfolio, after load describes when data is loaded from the database but is not yet converted into an entity. Spring Data JDBC used AfterLoadEvent as signal after materializing the entity. To address this deviation, we deprecated AfterLoadEvent in favor of AfterConvertEvent. Please switch to AfterConvertEvent if you’re using AfterLoadEvent in your application.

Tickets

M1

  • #578 - Support for streaming large result sets.

  • #974 - Better support for java.time types.

  • #935 - Dialects register database dependent custom conversions.

  • #987 - Support for AggregateReference in query derivation.

M2

  • #920 - The Postgres dialect now consideres PGobject a simple type.

Spring Data R2DBC - 1.4

Spring Data Envers - 2.6

Release Dates

  • M1 - Jul 16, 2021

  • M2 - Aug 13, 2021

  • M3 - Sept 17, 2021

  • RC1 - Oct 14, 2021

  • GA - Nov 12, 2021

  • OSS Support until: Nov 2022

  • End of Life: tbd.

Clone this wiki locally