Cassandra 儲存庫
要訪問儲存在 Apache Cassandra 中的領域實體,您可以使用 Spring Data 精密的儲存庫支援,這極大地簡化了 DAO 的實現。為此,請為您的儲存庫建立一個介面,如下例所示
@Table
public class Person {
@Id
private String id;
private String firstname;
private String lastname;
// … getters and setters omitted
}
請注意,實體有一個名為 id
且型別為 String
的屬性。MappingCassandraConverter
中使用的預設轉換機制(它是儲存庫支援的基礎)將名為 id
的屬性視為行 ID。
以下示例展示了用於持久化 Person
實體的儲存庫定義
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 配置中,新增以下內容(如果您使用 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。預設情況下,儲存庫會與一個名為 cassandraTemplate
的 CassandraTemplate
Spring Bean 連線,因此如果您偏離此約定,才需要顯式配置 cassandra-template-ref
。
由於我們的領域儲存庫擴充套件了 CrudRepository
或 ReactiveCrudRepository
,它為您提供了基本的 CRUD 操作。使用儲存庫例項只需將儲存庫作為依賴項注入到客戶端中,如下例所示,透過自動裝配 PersonRepository
來實現
-
命令式
-
響應式
@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
實體的分頁訪問-
命令式
-
響應式
@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
例項。