Spring Data对Cassandra 3的支持

魏俊茂
2023-12-01

名为Ingalls的新Spring Data发布火车发布引起了我的关注,其中之一是Spring Data Cassandra最终支持Cassandra 3+。 因此,我回顾了我的一个旧样本,并尝试了较新版本的Cassandra。

安装Cassandra

第一步是安装本地版本的Cassandra,我继续发现ccm工具在能够启动和拆除小型集群方面非常出色。 这是我正在运行的命令,用于启动一个基于3个节点的Apache Cassandra 3.9集群。

ccm create test -v 3.9 -n 3 -s --vnodes

创建模式

连接到集群中的节点:

ccm node1 cqlsh

CREATE KEYSPACE IF NOT EXISTS sample WITH replication = {'class':'SimpleStrategy', 'replication_factor':1};

接下来,我需要创建表来保存数据。 卡桑德拉(Cassandra)的一般建议是根据查询模式对表进行建模-鉴于此,我首先定义一个表来保存基本的“旅馆”信息:

CREATE TABLE IF NOT EXISTS  sample.hotels (
    id UUID,
    name varchar,
    address varchar,
    state varchar,
    zip varchar,
    primary key((id), name)
);

假设我必须支持两种查询模式–基于说第一个字母的酒店检索和按州检索酒店,我有一个“ hotels_by_letter”非规范化表来支持按“第一个字母”检索:

CREATE TABLE IF NOT EXISTS  sample.hotels_by_letter (
    first_letter varchar,
    hotel_name varchar,
    hotel_id UUID,
    address varchar,
    state varchar,
    zip varchar,
    primary key((first_letter), hotel_name, hotel_id)
);

仅针对各种情况,就可以使用“ hotels_by_state”实例化视图来支持按酒店所在的州进行检索:

CREATE MATERIALIZED VIEW sample.hotels_by_state AS
    SELECT id, name, address, state, zip FROM hotels
        WHERE state IS NOT NULL AND id IS NOT NULL AND name IS NOT NULL
    PRIMARY KEY ((state), name, id)
    WITH CLUSTERING ORDER BY (name DESC)

编码库

在Java方面,由于我要持久存储并查询一个称为“ Hotel”的简单域类型,因此如下所示:

@Table("hotels")
public class Hotel implements Serializable {
    @PrimaryKey
    private UUID id;
    private String name;
    private String address;
    private String state;
    private String zip;
    ...
}

现在,要能够对该实体执行基本的CRUD操作,所需的就是一个存储库接口 ,如以下代码所示:

import cass.domain.Hotel;
import org.springframework.data.repository.CrudRepository;

import java.util.UUID;

public interface HotelRepository extends CrudRepository<Hotel, UUID>, HotelRepositoryCustom {}

此存储库还从HotelRepositoryCustom接口继承,该接口将提供自定义查找器以支持按名字和状态进行检索。

现在要保留一个酒店实体,我要做的就是调用存储库方法:

hotelRepository.save(hotel);

实例化视图中的数据由Cassandra自动同步和维护,但是“ hotels_by_letter”表中的数据必须通过代码进行管理,因此我定义了另一个存储库来维护该表中的数据:

public interface HotelByLetterRepository 
        extends CrudRepository<HotelByLetter, HotelByLetterKey>, HotelByLetterRepositoryCustom {}

自定义界面及其实现是为了方便根据酒店名称的首字母在查询中搜索此表,并通过
Spring数据Cassandra的自定义存储库实现功能。

import com.datastax.driver.core.querybuilder.QueryBuilder;
import com.datastax.driver.core.querybuilder.Select;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.cassandra.core.CassandraTemplate;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public class HotelRepositoryImpl implements HotelRepositoryCustom {

    private final CassandraTemplate cassandraTemplate;

    @Autowired
    public HotelRepositoryImpl(CassandraTemplate cassandraTemplate) {
        this.cassandraTemplate = cassandraTemplate;
    }

    @Override
    public List<Hotel> findByState(String state) {
        Select select = QueryBuilder.select().from("hotels_by_state");
        select.where(QueryBuilder.eq("state", state));
        return this.cassandraTemplate.select(select, Hotel.class);
    }
}

@Repository
public class HotelByLetterRepositoryImpl implements HotelByLetterRepositoryCustom {
    private final CassandraTemplate cassandraTemplate;

    public HotelByLetterRepositoryImpl(CassandraTemplate cassandraTemplate) {
        this.cassandraTemplate = cassandraTemplate;
    }

    @Override
    public List<HotelByLetter> findByFirstLetter(String letter) {
        Select select = QueryBuilder.select().from("hotels_by_letter");
        select.where(QueryBuilder.eq("first_letter", letter));
        return this.cassandraTemplate.select(select, HotelByLetter.class);
    }

}

给定这些存储库类,提供查询支持的自定义存储库,其余的代码是将Spring Boot的Cassandra Auto Configuration所促进的所有工作联系在一起。

本质上就是全部, Spring Data Cassandra使与Cassandra 3+的交互变得非常简单。

我相信,一个完整的工作项目可以更好地熟悉这个出色的库,并且我的github仓库中也提供了这样的示例– https://github.com/bijukunjummen/sample-boot-with-cassandra

翻译自: https://www.javacodegeeks.com/2017/01/spring-data-support-cassandra-3.html

 类似资料: