Cassandra 存储库
要访问存储在 Apache Cassandra 中的域实体,您可以使用 Spring Data 的复杂存储库支持,这大大简化了 DAO 的实施。 为此,请为您的仓库创建一个接口,如下例所示:
@Table
public class Person {
@Id
private String id;
private String firstname;
private String lastname;
// … getters and setters omitted
}
请注意,该实体具有名为 type 的属性。
中使用的默认转换机制(支持存储库支持)将名为 property 视为行 ID。id
String
MappingCassandraConverter
id
以下示例显示了用于保留实体的存储库定义:Person
Person
-
Imperative
-
Reactive
interface PersonRepository extends CrudRepository<Person, String> {
// additional custom finder methods go here
}
interface PersonRepository extends ReactiveCrudRepository<Person, String> {
// additional custom finder methods go here
}
现在,前面示例中的接口仅用于键入目的,但我们稍后会向其添加其他方法。
接下来,在 Spring 配置中,添加以下内容(如果使用 Java 进行配置):
如果要使用 Java 配置,请使用相应的 Comments。
注解带有与 namespace 元素相同的属性。
如果未配置基础包,则基础架构将扫描带注释的配置类的包。
以下示例显示了如何使用不同的配置方法:@EnableCassandraRepositories
@EnableReactiveCassandraRepositories
-
Imperative Java Configuration
-
XML
-
Reactive Java Configuration
@Configuration
@EnableCassandraRepositories
class ApplicationConfig extends AbstractCassandraConfiguration {
@Override
protected String getKeyspaceName() {
return "keyspace";
}
public String[] getEntityBasePackages() {
return new String[] { "com.oreilly.springdata.cassandra" };
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cassandra="http://www.springframework.org/schema/data/cassandra"
xsi:schemaLocation="
http://www.springframework.org/schema/data/cassandra
https://www.springframework.org/schema/data/cassandra/spring-cassandra.xsd
http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<cassandra:session port="9042" keyspace-name="keyspaceName"/>
<cassandra:mapping
entity-base-packages="com.acme..entities">
</cassandra:mapping>
<cassandra:converter/>
<cassandra:template/>
<cassandra:repositories base-package="com.acme..entities"/>
</beans>
@Configuration
@EnableReactiveCassandraRepositories
class ApplicationConfig extends AbstractReactiveCassandraConfiguration {
@Override
protected String getKeyspaceName() {
return "keyspace";
}
public String[] getEntityBasePackages() {
return new String[] { "com.oreilly.springdata.cassandra" };
}
}
namespace 元素会导致扫描基本包,以查找扩展 Spring bean 的接口,并为每个找到的 Spring bean 创建 Spring bean。
默认情况下,存储库与名为 的 Spring bean 连接,因此只有在偏离此约定时才需要显式配置。cassandra:repositories
CrudRepository
CassandraTemplate
cassandraTemplate
cassandra-template-ref
因为我们的域仓库扩展了各自的 ,所以它为您提供了基本的 CRUD 操作。
使用 repository 实例是将 repository 作为依赖项注入 client 的问题,如下例通过 autowiring 所做的那样:CrudRepository
ReactiveCrudRepository
PersonRepository
-
Imperative
-
Reactive
@ExtendWith(SpringExtension.class)
class PersonRepositoryTests {
@Autowired PersonRepository repository;
@Test
void readsPersonTableCorrectly() {
List<Person> persons = repository.findAll();
assertThat(persons.isEmpty()).isFalse();
}
}
public class PersonRepositoryTests {
@Autowired ReactivePersonRepository repository;
@Test
public void sortsElementsCorrectly() {
Flux<Person> people = repository.findAll(Sort.by(new Order(ASC, "lastname")));
}
}
Cassandra 存储库支持分页和排序,以便对实体进行分页和排序访问。
Cassandra 分页需要分页状态才能在页面中进行仅进导航。
A 跟踪当前的分页状态,并允许创建 a 以请求下一页。
以下示例演示如何设置对实体的分页访问:Slice
Pageable
Person
Person
-
Imperative
-
Reactive
@ExtendWith(SpringExtension.class)
class PersonRepositoryTests {
@Autowired PersonRepository repository;
@Test
void readsPagesCorrectly() {
Slice<Person> firstBatch = repository.findAll(CassandraPageRequest.first(10));
assertThat(firstBatch).hasSize(10);
Slice<Person> nextBatch = repository.findAll(firstBatch.nextPageable());
// …
}
}
@ExtendWith(SpringExtension.class)
class PersonRepositoryTests {
@Autowired PersonRepository repository;
@Test
void readsPagesCorrectly() {
Mono<Slice<Person>> firstBatch = repository.findAll(CassandraPageRequest.first(10));
Mono<Slice<Person>> nextBatch = firstBatch.flatMap(it -> repository.findAll(it.nextPageable()));
// …
}
}}
Cassandra 存储库不会扩展,因为使用 limit/offset 的经典分页模式不适用于 Cassandra。PagingAndSortingRepository |
前面的示例使用 Spring 的单元测试支持创建一个应用程序上下文,该上下文在测试类中执行基于 Comments 的依赖项注入。
在测试用例(测试方法)中,我们使用存储库来查询数据存储。
我们调用请求所有实例的 repository 查询方法。Person
反应式存储库
Spring Data 的存储库抽象是一个动态 API,主要由您和您的需求在您声明查询方法时定义。 反应式 Cassandra 存储库可以通过使用 RxJava 或 Project Reactor 包装器类型来实现,方法是从特定于库的存储库接口之一进行扩展:
-
ReactiveCrudRepository
-
ReactiveSortingRepository
-
RxJava3CrudRepository
-
RxJava3SortingRepository
Spring Data 在幕后转换反应式包装器类型,以便您可以坚持使用自己喜欢的组合库。