从 Spring Data Couchbase 3.x 迁移到 4.x
本章快速列出 4.x 引入的主要变更,并对迁移时需要考虑的事项给出高层概述。
请注意,最低 Couchbase Server 版本已隐含提升到 5.5 及之后版本,我们建议至少运行 6.0.x。
配置
由于主要目标是从 Java SDK 2 迁移到 3,配置已做改动以适配新的 SDK,并从长远为作用域和集合做好准备(但仍可在不使用集合支持的情况下使用)。
XML 配置支持已被移除,因此仅支持基于 java/注解的配置。
您的配置仍然必须继承 AbstractCouchbaseConfiguration,但由于 RBAC(基于角色的访问控制)现在是强制性的,需要覆盖不同的属性才能完成配置:getConnectionString、getUserName、getPassword 和 getBucketName。如果您想可选地使用非默认作用域,可以覆盖 getScopeName 方法。请注意,如果您想使用基于证书的认证,或需要自定义密码认证,可以覆盖 authenticator 方法来完成此任务。
新的 SDK 仍然有一个用于配置它的环境,因此如有需要,您可以覆盖 configureEnvironment 方法并提供自定义配置。
有关更多信息,请参阅安装与配置。
Spring Boot 版本兼容性
Spring Boot 2.3.x 或更高版本依赖 Spring Data Couchbase 4.x。更早版本的 Couchbase 不可用,因为 SDK 2 和 3 不能共存于同一个 classpath 上。
实体
处理实体的方式没有变化,不过由于 SDK 不再随附注解,现在仅支持与 Spring-Data 相关的注解。
具体而言:
-
com.couchbase.client.java.repository.annotation.Id变为import org.springframework.data.annotation.Id -
com.couchbase.client.java.repository.annotation.Field变为import org.springframework.data.couchbase.core.mapping.Field
org.springframework.data.couchbase.core.mapping.Document 注解保持不变。
有关更多信息,请参阅实体建模。
自动索引管理
自动索引管理经过重新设计,以支持更灵活的索引。引入了新的注解,而 @ViewIndexed、@N1qlSecondaryIndexed 和 @N1qlPrimaryIndexed 等旧注解已被移除。
有关更多信息,请参阅自动索引管理。
模板与 ReactiveTemplate
由于 Couchbase SDK 3 移除了对 RxJava 的支持并转而支持 Reactor,couchbaseTemplate 和 reactiveCouchbaseTemplate 都可以直接从 AbstractCouchbaseConfiguration 访问。
模板经过彻底重构,现在使用流式 API 进行配置,而不是众多方法重载。这样做的好处是,未来我们能够扩展功能,而不必引入越来越多、令导航变得复杂的重载。
下表描述了 3.x 中的方法名,并与 4.x 中的对应方法进行对比:
表 1. 模板方法对比
| SDC 3.x | SDC 4.x |
|---|---|
| save | upsertById |
| insert | insertById |
| update | replaceById |
| findById | findById |
| findByView | (已移除) |
| findBySpatialView | (已移除) |
| findByN1QL | findByQuery |
| findByN1QLProjection | findByQuery |
| queryN1QL | (直接调用 SDK) |
| exists | existsById |
| remove | removeById |
| execute | (直接调用 SDK) |
此外,还新增了以下在 3.x 中不可用的方法:
表 2. 4.x 中新增的模板方法
| 名称 | 描述 |
|---|---|
| removeByQuery | 通过 N1QL 查询移除实体 |
| findByAnalytics | 通过分析服务执行查找 |
| findFromReplicasById | 类似 findById,但会考虑副本 |
我们尝试将 API 更紧密地统一并对齐到底层 SDK 语义,以便它们更易于关联和导航。
有关更多信息,请参阅模板与直接操作。
仓库与查询
-
org.springframework.data.couchbase.core.query.Query变为org.springframework.data.couchbase.repository.Query -
org.springframework.data.couchbase.repository.ReactiveCouchbaseSortingRepository已被移除。请考虑继承ReactiveSortingRepository或ReactiveCouchbaseRepository -
org.springframework.data.couchbase.repository.CouchbasePagingAndSortingRepository已被移除。请考虑继承PagingAndSortingRepository或CouchbaseRepository
视图支持已被移除,N1QL 查询现在对于所有自定义仓库方法以及内置方法而言,默认都是一等公民。
查询派生机制的工作方式与前一版本相比没有变化。如果您遇到任何过去可用、现在却不再工作的查询,请告知我们。
可以通过新的 ScanConsistency 注解覆盖 N1QL 查询的默认扫描一致性。
getCouchbaseOperations() 方法也已被移除。您仍可通过 CouchbaseTemplate 或 Cluster 类访问原生 Java SDK 的所有方法:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.couchbase.core.CouchbaseTemplate;
import org.springframework.stereotype.Service;
import com.couchbase.client.java.Cluster;
@Service
public class MyService {
@Autowired
private CouchbaseTemplate couchbaseTemplate;
@Autowired
private Cluster cluster;
}
有关更多信息,请参阅 Couchbase 仓库。
全文搜索(FTS)
FTS API 已被简化,现在可通过 Cluster 类访问:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.couchbase.client.java.Cluster;
import com.couchbase.client.java.search.result.SearchResult;
import com.couchbase.client.java.search.result.SearchRow;
import com.couchbase.client.core.error.CouchbaseException;
@Service
public class MyService {
@Autowired
private Cluster cluster;
public void myMethod() {
try {
final SearchResult result = cluster
.searchQuery("index", SearchQuery.queryString("query"));
for (SearchRow row : result.rows()) {
System.out.println("Found row: " + row);
}
System.out.println("Reported total rows: "
+ result.metaData().metrics().totalRows());
} catch (CouchbaseException ex) {
ex.printStackTrace();
}
}
}
有关更多信息,请参阅FTS 文档。