对于最新的稳定版本,请使用 Spring Data Cassandra 4.3.1Spring中文文档

对于最新的稳定版本,请使用 Spring Data Cassandra 4.3.1Spring中文文档

要访问存储在 Apache Cassandra 中的域实体,您可以使用 Spring Data 复杂的存储库支持,这大大简化了 DAO 的实现。 为此,请为存储库创建一个接口,如以下示例所示:Spring中文文档

例 1.Sample Person 实体
@Table
public class Person {

  @Id
  private String id;
  private String firstname;
  private String lastname;

  // … getters and setters omitted
}

请注意,该实体具有一个名为 类型的属性。 中使用的默认转换机制(支持存储库支持)将命名的属性视为行 ID。idStringMappingCassandraConverteridSpring中文文档

以下示例显示了用于持久化实体的存储库定义:PersonSpring中文文档

用于持久化实体的基本存储库接口Person
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中文文档

接下来,在您的 Spring 配置中,添加以下内容(如果您使用 Java 进行配置):Spring中文文档

如果要使用 Java 配置,请使用相应的注释。 注释具有与命名空间元素相同的属性。 如果未配置基本包,基础结构将扫描带批注的配置类的包。 以下示例演示了如何采用不同的配置方法:@EnableCassandraRepositories@EnableReactiveCassandraRepositoriesSpring中文文档

存储库的配置
@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 连接,因此只有在偏离此约定时才需要显式配置。cassandra:repositoriesCrudRepositoryCassandraTemplatecassandraTemplatecassandra-template-refSpring中文文档

因为我们的域存储库扩展了相应的 ,它为您提供了基本的 CRUD 操作。 使用存储库实例是将存储库作为依赖项注入客户端的问题,如以下示例通过自动连接所做的那样:CrudRepositoryReactiveCrudRepositoryPersonRepositorySpring中文文档

对 Person 实体的基本访问权限
@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 以请求下一页。 以下示例演示如何设置对实体的分页访问:SlicePageablePersonSpring中文文档

对实体的分页访问Person
@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 的单元测试支持创建一个应用程序上下文,该上下文执行基于注释的依赖项注入到测试类中。 在测试用例(测试方法)中,我们使用存储库来查询数据存储。 我们调用请求所有实例的存储库查询方法。PersonSpring中文文档

Cassandra 存储库不扩展,因为使用 limit/offset 的经典分页模式不适用于 Cassandra。PagingAndSortingRepository

响应式存储库

Spring Data 的存储库抽象是一个动态 API,主要由您和您的需求在声明查询方法时定义。 Reactive Cassandra 存储库可以通过使用 RxJava 或 Project Reactor 包装器类型来实现,方法是从特定于库的存储库接口之一扩展:Spring中文文档

Spring Data 在后台转换反应式包装器类型,以便您可以坚持使用自己喜欢的合成库。Spring中文文档