该模板提供对基础数据库的较低级别访问,并用作存储库的基础。
任何时候,如果存储库对于您的需求来说太高,模板就很有可能为您提供良好的服务。请注意,
您始终可以通过 .AbstractCouchbaseConfiguration
支持的操作
可以通过上下文之外的 和 bean 访问该模板。
一旦你得到了对它的引用,你就可以对它运行各种操作。
除了通过存储库之外,在模板中,您需要始终指定要转换的目标实体类型。couchbaseTemplate
reactiveCouchbaseTemplate
这些模板使用流畅风格的 API,允许您根据需要链接可选运算符。举个例子,这里是 如何存储用户,然后通过其 ID 再次找到它:
// Create an Entity
User user = new User(UUID.randomUUID().toString(), "firstname", "lastname");
// Upsert it
couchbaseTemplate.upsertById(User.class).one(user);
// Retrieve it again
User found = couchbaseTemplate.findById(User.class).one(user.getId());
如果要对操作使用自定义(默认情况下将使用注释中的持久性选项)持久性要求,则可以将其链接到:@Document
upsert
User modified = couchbaseTemplate
.upsertById(User.class)
.withDurability(DurabilityLevel.MAJORITY)
.one(user);
以类似的方式,您可以执行 N1QL 操作:
final List<User> foundUsers = couchbaseTemplate
.findByQuery(User.class)
.consistentWith(QueryScanConsistency.REQUEST_PLUS)
.all();
子文档操作
Couchbase 支持子文档操作。本节介绍如何将其与 Spring Data Couchbase 一起使用。
子文档操作可能比更新插入或替换等完整文档操作更快、更高效,因为它们仅通过网络传输文档的访问部分。
子文档操作也是原子操作,因为如果一个子文档突变失败,那么所有子文档都失败了,从而允许使用内置并发控制对文档进行安全修改。
目前 Spring Data Couchbase 仅支持子文档突变(删除、更新、替换和插入)。
变更操作可修改文档中的一条或多条路径。这些操作中最简单的是 upsert,它类似于 fulldoc 级别的 upsert,它将修改现有路径的值,或者创建它(如果它不存在):
以下示例将更新用户地址上的城市字段,而不会传输任何其他用户文档数据。
User user = new User();
// id field on the base document id required
user.setId(ID);
user.setAddress(address);
couchbaseTemplate.mutateInById(User.class)
.withUpsertPaths("address.city")
.one(user);
执行多个子文档操作
可以在同一文档上同时执行多个子文档操作,允许您一次修改多个子文档。当在单个 mutateIn 命令的上下文中提交多个操作时,服务器将使用相同版本的文档执行所有操作。
要执行多个突变操作,可以使用方法链接。
couchbaseTemplate.mutateInById(User.class)
.withInsertPaths("roles", "subuser.firstname")
.withRemovePaths("address.city")
.withUpsertPaths("firstname")
.withReplacePaths("address.street")
.one(user);
并发修改
对文档不同部分的并发子文档操作不会发生冲突,因此默认情况下,在执行突变时不会提供 CAS 值。 如果需要 CAS,则可以按以下方式提供:
User user = new User();
// id field on the base document id required
user.setId(ID);
// @Version field should have a value for CAS to be supplied
user.setVersion(cas);
user.setAddress(address);
couchbaseTemplate.mutateInById(User.class)
.withUpsertPaths("address.city")
.withCasProvided()
.one(user);
异常翻译
Spring Framework 为各种数据库和映射技术提供异常转换。
传统上,这是针对 JDBC 和 JPA 的。
Spring Data Couchbase 通过提供接口的实现将此功能扩展到 Couchbase。org.springframework.dao.support.PersistenceExceptionTranslator
映射到 Spring 一致的数据访问异常层次结构背后的动机是让您编写可移植和描述性的异常处理代码,而无需针对特定的 Couchbase 异常进行编码和处理。
Spring 的所有数据访问异常都是从该类继承而来的,因此您可以确保可以在单个 try-catch 块中捕获所有与数据库相关的异常。DataAccessException
ReactiveCouchbase
尽早传播异常。
在处理反应序列期间发生的异常将作为错误信号发出。