Cassandra Repositories

要訪問儲存在 Apache Cassandra 中的域實體,您可以使用 Spring Data 精密的儲存庫支援,這大大簡化了 DAO 的實現。為此,請為您的儲存庫建立一個介面,示例如下所示

示例 1. 示例 Person 實體
@Table
public class Person {

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

  // … getters and setters omitted
}

請注意,實體有一個名為 idString 型別屬性。MappingCassandraConverter(支援儲存庫)中使用的預設轉換機制將名為 id 的屬性視為行 ID。

以下示例展示了用於持久化 Person 實體的儲存庫定義

用於持久化 Person 實體的基本儲存庫介面
  • 命令式

  • 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 配置,請使用 @EnableCassandraRepositories@EnableReactiveCassandraRepositories 註解。該註解具有與名稱空間元素相同的屬性。如果未配置基本包,則基礎設施會掃描註解配置類的包。以下示例展示了不同的配置方法

儲存庫配置
  • 命令式 Java 配置

  • XML

  • 響應式 Java 配置

@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" };
  }
}

cassandra:repositories 名稱空間元素會掃描基本包中擴充套件 CrudRepository 的介面,併為每個找到的介面建立 Spring bean。預設情況下,儲存庫透過名為 cassandraTemplateCassandraTemplate Spring bean 進行連線,因此只有當您偏離此約定,才需要顯式配置 cassandra-template-ref

由於我們的域儲存庫擴充套件了 CrudRepositoryReactiveCrudRepository,它為您提供了基本的 CRUD 操作。使用儲存庫例項只需將儲存庫作為依賴項注入到客戶端中,如下例透過自動裝配 PersonRepository 所做

對 Person 實體的基本訪問
  • 命令式

  • 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 分頁需要一個分頁狀態才能向前導航頁面。Slice 跟蹤當前分頁狀態並允許建立 Pageable 以請求下一頁。以下示例展示瞭如何設定對 Person 實體的分頁訪問

Person 實體的分頁訪問
  • 命令式

  • 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 儲存庫不擴充套件 PagingAndSortingRepository,因為使用 limit/offset 的經典分頁模式不適用於 Cassandra。

前面的示例使用 Spring 的單元測試支援建立了一個應用程式上下文,該支援對測試類執行基於註解的依賴注入。在測試用例(測試方法)中,我們使用儲存庫查詢資料儲存。我們呼叫請求所有 Person 例項的儲存庫查詢方法。

響應式儲存庫

Spring Data 的儲存庫抽象是一個動態 API,主要由您和您的需求在宣告查詢方法時定義。響應式 Cassandra 儲存庫可以透過擴充套件其中一個庫特定的儲存庫介面,使用 RxJava 或 Project Reactor 包裝器型別來實現

  • ReactiveCrudRepository

  • ReactiveSortingRepository

  • RxJava3CrudRepository

  • RxJava3SortingRepository

Spring Data 在幕後轉換響應式包裝器型別,以便您可以堅持使用自己喜歡的組合庫。

© . This site is unofficial and not affiliated with VMware.