此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Data Couchbase 5.5.2! |
模板和直接作
该模板提供对底层数据库的较低级别访问,并用作存储库的基础。
任何时候存储库对于您的需求来说太高,模板很有可能为您服务。请注意
您始终可以通过AbstractCouchbaseConfiguration
.
支持的作
可以通过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 仅支持子文档变更(删除、更新插入、替换和插入)。
变更作修改文档中的一个或多个路径。这些作中最简单的是更新插入,它与 fulldoc 级更新插入类似,将修改现有路径的值,或者在现有路径不存在时创建它:
以下示例将更新插入用户地址上的城市字段,而不传输任何其他用户文档数据。
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 通过提供org.springframework.dao.support.PersistenceExceptionTranslator
接口。
映射到 Spring 一致的数据访问异常层次结构背后的动机是让您编写可移植的描述性异常处理代码,而无需针对和处理特定的 Couchbase 异常进行编码和处理。
Spring 的所有数据访问异常都继承自DataAccessException
类,因此您可以确保可以在单个 try-catch 块中捕获所有与数据库相关的异常。
ReactiveCouchbase
尽早传播异常。
在处理反应序列期间发生的异常作为错误信号发出。