Spring Data 2021.2 (Raj)升级说明

本文概述了SpringData2021.2版本的多个模块更新,包括SpringDataCommons中的类加载器配置、新特性EntityProjection和属性特定值转换器,SpringDataJPA支持派生查询和新方法,MongoDB支持更新表达式和属性转换,Redis增强了ACL和ListenerContainer,以及JDBC和R2DBC的优化和兼容性提升。
摘要由CSDN通过智能技术生成

Spring Data 2021.2 (Raj) Release Notes

Spring Data Commons—2.7

1、 SimpleTypeInformationMapper中配置类加载器

SimpleTypeInformationMapper现在可以配置类加载器ClassLoader。确保在将类名转换为实际类对象的过程中,能够正确地使用到特定的类加载器。这样做可以应对一些复杂场景,尤其是当需要访问那些通过非默认类加载器(如自定义类加载器)加载的类时。

2、增加了类EntityProjection

3、支持属性特定值转换器

@Document(indexName = "guitars")
public record Guitar(
		@Id String id,
		@Field(type = FieldType.Keyword)
		@ValueConverter(ManufacturerPropertyValueConverter.class) // <-- 
		Manufacturer manufacturer,
		@Field(type = FieldType.Integer)
		Integer year) {
}
import org.springframework.data.elasticsearch.core.convert.AbstractPropertyValueConverter;
import org.springframework.data.mapping.PersistentProperty;

public class ManufacturerPropertyValueConverter extends AbstractPropertyValueConverter {
	public ManufacturerPropertyValueConverter(PersistentProperty<?> property) {
		super(property);
	}

	@Override
	public Object write(Object value) {
		if (value instanceof Manufacturer m) {
			return m.getDisplayName();
		}
		return value;
	}

	@Override
	public Object read(Object value) {
		if (value instanceof String s && Manufacturer.class.isAssignableFrom(getProperty().getType())) {
			var manufacturer = Manufacturer.of(s);
			if (manufacturer != null) {
				return manufacturer;
			}
		}
		return value;
	}
}

Spring Data JPA - 2.7

1、现在支持在派生查询使用DTO的情况下,创建一个select子句,该子句使用DTO类型的构造函数表达式

class CarProjection {
    String name;
    List<Color> colors;

    public CarProjection (String name, List<color> colors) {
        ...
    }    
}

class Car{
    String name;

    @OneToMany(mappedBy = "car")
    List<Color> colors;
}

class Color{
     @ManyToOne
     Car car;
}

2、JpaRepository.getReferenceById 代替 JpaRepository.getById

引入 JpaRepository.getReferenceById 作为 JpaRepository.getById 的替代,与 JpaRepository.findById 的区别更加明显

3、解决了以 IdClass 作为主键的实体类导致的问题,以及不能与 deleteAllByIdInBatch 一起工作的bug

4、可以使用JpaSpecificationExecutor.exists来检查由Specification指定的实体是否存在。

boolean exists(Specification<T> spec)

5、 ignoreCase 操作符现在可以全面使用 lower() 函数

之前有地方用大写,有地方用消息,现在统一用小写
https://github.com/spring-projects/spring-data-jpa/issues/2420

Spring Data MongoDB - 3.4

1、更新方法

通过 @Update 注释支持修改文档,当将其添加到存储库查找器方法时,将对所有匹配的文档运行定义的表达式,并返回更新的文档的数量。

@Update("{ '$inc' : { 'visits' : ?1 } }")
long findAndIncrementVisitsByLastname(String lastname, int increment);

@Update(pipeline = {"{ '$set' : { 'visits' : { '$add' : [ '$visits', ?1 ] } } }"})
long findAndIncrementVisitsViaPipelineByLastname(String lastname, int increment);

@Query("{ 'lastname' : ?0 }")
@Update("{ '$inc' : { 'visits' : ?1 } }")
long updateAllByLastname(String lastname, int increment);

2、属性转换器

MongoDB数据模块利用commons模块,通过 MongoValueConverter 和 MongoConversionContext 实现了存储特定值的转换。除了使用 @ValueConverter 的声明式方法之外, MongoCustomConversions 允许编程注册仅应用于已定义的属性的转换器实现。

MongoCustomConversions.create(it -> {
  it.configurePropertyConversions(registrar -> {
    registrar.registerConverter(Person.class, "ssn", new MongoValueConverter<>() { ... });
  })
})

Spring Data Redis - 2.7

1、ACL支持哨兵配置

当使用Redis 6时,现在可以使用ACL身份验证对Redis Sentinel进行身份验证,除了提供哨兵密码外,还可以提供用户名。在配置用户名时,jedi和Lettuce都将可以使用ACL身份验证方法。

2、修订 RedisMessageListenerContainer

这个版本中,重写了 RedisMessageListenerContainer 关于订阅和生命周期状态转换行为的内部机制。start() 方法现在阻塞直到订阅完全建立。stop() 方法现在阻塞直到订阅完全关闭。
如果容器正在启动,并且同时注册了监听器,那么前面的实现会遇到潜在的竞争条件。竞争不会再发生,因为 start() 方法被阻止来自多个线程的并发调用,并且 start() 方法在容器完全启动后返回。因此,当在Spring上下文中使用 RedisMessageListenerContainer 时,由于同步时间延长,上下文启动/关闭阶段可能需要更长一点的时间。

Spring Data JDBC - 2.4

1、对单个聚合的多个插入将被批量处理

当聚合包含一对多关系时,引用实体的插入现在使用JDBC批处理操作执行。 仅当数据库不需要生成id或数据库支持为批量语句返回多个id时,才启用批量操作。

2、@Lock for derived queries(通过定义方法名来自动生成相应的数据库查询)

对于derived queries,现在可以使用 @Lock 注释,来获得悲观锁

interface UserRepository extends CrudRepository<User, Long> {

  @Lock(LockMode.PESSIMISTIC_READ)
  List<User> findByLastname(String lastname);
}

生成类似的查询

Select * from user u where u.lastname = lastname LOCK IN SHARE MODE

3、NULL优先级

如果底层数据库支持Null优先级,现在可以提供一个 Sort ,就像这样 Sort.by(new Sort.Order(Sort.Direction.ASC, “name”, Sort.NullHandling.NULLS_LAST))。
确定将null放在排序的最前还是最后。

4、以 @Table 注解指定模式。
@Table 注解现在提供了一个属性来指定表所在的模式。

@Table(schema = "MY_SCHEMA")
static class EntityWithSchemaFromNamingStrategy {
    @Id private Long id;
}

无论是否显式指定表名,都可以工作

@Table(schema = "MY_SCHEMA", name = "A_TABLE_NAME")
static class EntityWithExplicitSchema {
    @Id private Long id;
}

Spring Data R2DBC - 1.5

1、与R2DBC 0.9兼容
Spring Data R2DBC可与R2DBC 0.9一起使用。要使用R2DBC 0.9,需要兼容R2DBC 0.9的驱动程序,并且需要将规范接口升级到 0.9.0.RELEASE 。当使用Maven时, pom.xml 可能包含以下依赖:

<dependencies>

  <dependency>
    <groupId>io.r2dbc</groupId>
    <artifactId>r2dbc-spi</artifactId>
    <version>0.9.0.RELEASE</version>
  </dependency>

  <dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>r2dbc-postgresql</artifactId>
    <version>0.9.0.RELEASE</version>
  </dependency>

</dependencies>
  • 20
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: 中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·本文档为双语同时展示,一行原文、一行译文,可逐行对照,避免了原文/译文来回切换的麻烦; ·有原文可参照,不再担心翻译偏差误导; ·边学技术、边学英语。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: 中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·本文档为双语同时展示,一行原文、一行译文,可逐行对照,避免了原文/译文来回切换的麻烦; ·有原文可参照,不再担心翻译偏差误导; ·边学技术、边学英语。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值