Spring Data Cassandra简介

栏目: Java · 发布时间: 5年前

内容简介:我们将从基础开始,完成配置和编码,最后构建一个完整的Spring Data Cassandra模块。1.概述本文使用Spring Data访问与Cassandra的实用介绍。Cassandra是一个支持快速写入的NoSQL数据库,可以用作事件溯源的事件存储等。

我们将从基础开始,完成配置和编码,最后构建一个完整的Spring Data Cassandra模块。

1.概述

本文使用Spring Data访问与Cassandra的实用介绍。Cassandra是一个支持快速写入的NoSQL数据库,可以用作事件溯源的事件存储等。

2. Maven依赖

让我们首先使用Maven 定义pom.xml中的依赖项:

<dependency>
    <groupId>com.datastax.cassandra</groupId>
    <artifactId>cassandra-driver-core</artifactId>
    <version>2.1.9</version>
</dependency>

3. Cassandra的配置

我们将在整个过程中使用 Java 风格的配置来配置Cassandra集成。

3.1。主配置

让我们从主配置类开始 - 当然是通过类级别@Configuration注释驱动的:

@Configuration
<b>public</b> <b>class</b> CassandraConfig <b>extends</b> AbstractCassandraConfiguration {
 
    @Override
    <b>protected</b> String getKeyspaceName() {
        <b>return</b> <font>"testKeySpace"</font><font>;
    }
 
    @Bean
    <b>public</b> CassandraClusterFactoryBean cluster() {
        CassandraClusterFactoryBean cluster = 
          <b>new</b> CassandraClusterFactoryBean();
        cluster.setContactPoints(</font><font>"127.0.0.1"</font><font>);
        cluster.setPort(9142);
        <b>return</b> cluster;
    }
 
    @Bean
    <b>public</b> CassandraMappingContext cassandraMapping() 
      throws ClassNotFoundException {
        <b>return</b> <b>new</b> BasicCassandraMappingContext();
    }
}
</font>

注意新的bean - BasicCassandraMappingContext - 带有默认实现。这是在对象和持久格式之间映射持久性实体所必需的。

由于默认实现足够,我们可以直接使用它。

3.2。Cassandra连接属性

我们必须配置三个必需的设置来设置Cassandra客户端的连接。

我们必须设置Cassandra服务器作为contactPoints运行的主机名。端口只是服务器中请求的侦听端口。KeyspaceName是定义节点上数据复制的命名空间,它基于Cassandra相关概念。

4. Cassandra存储库

我们将使用CassandraRepository作为数据访问层。这遵循Spring Data存储库抽象,该抽象集中于抽象出跨不同持久性机制实现数据访问层所需的代码。

4.1。创建CassandraRepository

让我们创建要在配置中使用的CassandraRepository:

@Repository
<b>public</b> <b>interface</b> BookRepository <b>extends</b> CassandraRepository<Book> {
    <font><i>//</i></font><font>
}
</font>

4.2。CassandraRepository的配置

现在,我们可以扩展第3.1节中的配置,添加@EnableCassandraRepositories类级别注释来标记我们在CassandraConfig的 4.1节中创建的Cassandra存储库:

@Configuration
@EnableCassandraRepositories(
  basePackages = <font>"org.baeldung.spring.data.cassandra.repository"</font><font>)
<b>public</b> <b>class</b> CassandraConfig <b>extends</b> AbstractCassandraConfiguration {
    </font><font><i>//</i></font><font>
}
</font>

5.实体

让我们快速浏览一下实体 - 我们将要使用的模型类。该类已注释,并为嵌入模式下的元数据Cassandra数据表创建定义了其他参数。

使用@Table注释,bean直接映射到Cassandra数据表。此外,每个属性都定义为一种主键或一个简单列:

@Table
<b>public</b> <b>class</b> Book {
    @PrimaryKeyColumn(
      name = <font>"isbn"</font><font>, 
      ordinal = 2, 
      type = PrimaryKeyType.CLUSTERED, 
      ordering = Ordering.DESCENDING)
    <b>private</b> UUID id;
    @PrimaryKeyColumn(
      name = </font><font>"title"</font><font>, ordinal = 0, type = PrimaryKeyType.PARTITIONED)
    <b>private</b> String title;
    @PrimaryKeyColumn(
      name = </font><font>"publisher"</font><font>, ordinal = 1, type = PrimaryKeyType.PARTITIONED)
    <b>private</b> String publisher;
    @Column
    <b>private</b> Set<String> tags = <b>new</b> HashSet<>();
    </font><font><i>// standard getters and setters</i></font><font>
}
</font>

6.使用嵌入式服务器进行测试

6.1。Maven依赖

如果要在嵌入模式下运行Cassandra(无需手动安装单独的Cassandra服务器),则需要将与cassandra-unit相关的依赖项添加到pom.xml:

<dependency>
    <groupId>org.cassandraunit</groupId>
    <artifactId>cassandra-unit-spring</artifactId>
    <version>2.1.9.2</version>
    <scope>test</scope>
    <exclusions>
        <exclusion>
        <groupId>org.cassandraunit</groupId>
        <artifactId>cassandra-unit</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.cassandraunit</groupId>
    <artifactId>cassandra-unit-shaded</artifactId>
    <version>2.1.9.2</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.hectorclient</groupId>
    <artifactId>hector-core</artifactId>
    <version>2.0-0</version>
</dependency>

可以使用嵌入式Cassandra服务器来测试此应用程序。主要优点是您不希望显式安装Cassandra。

此嵌入式服务器也与Spring JUnit Tests兼容。在这里,我们可以使用@RunWith注释和嵌入式服务器设置SpringJUnit4ClassRunner。因此,可以在不运行外部Cassandra服务的情况下实现完整的测试套件。

@RunWith(SpringJUnit4ClassRunner.<b>class</b>)
@ContextConfiguration(<b>class</b>es = CassandraConfig.<b>class</b>)
<b>public</b> <b>class</b> BookRepositoryIntegrationTest {
    <font><i>//</i></font><font>
}
</font>

6.2。启动和停止服务器

如果您正在运行外部Cassandra服务器,则可以忽略此部分。

我们必须为整个测试套件启动服务器一次,因此服务器启动方法标有@BeforeClass注释:

@BeforeClass
<b>public</b> <b>static</b> <b>void</b> startCassandraEmbedded() { 
    EmbeddedCassandraServerHelper.startEmbeddedCassandra(); 
    Cluster cluster = Cluster.builder()
      .addContactPoints(<font>"127.0.0.1"</font><font>).withPort(9142).build();
    Session session = cluster.connect(); 
}
</font>

接下来,我们必须确保在完成测试套件执行后服务器停止:

@AfterClass
<b>public</b> <b>static</b> <b>void</b> stopCassandraEmbedded() {
    EmbeddedCassandraServerHelper.cleanEmbeddedCassandra();
}

6.3。清洁数据表

最好在每次测试执行之前删除并创建数据表,以避免由于早期测试执行中的操作数据而导致的意外结果。

现在我们可以在服务器启动时创建数据表:

@Before
<b>public</b> <b>void</b> createTable() {
    adminTemplate.createTable(
      <b>true</b>, CqlIdentifier.cqlId(DATA_TABLE_NAME), 
      Book.<b>class</b>, <b>new</b> HashMap<String, Object>());
}

在每个测试用例执行后删除:

@After
<b>public</b> <b>void</b> dropTable() {
    adminTemplate.dropTable(CqlIdentifier.cqlId(DATA_TABLE_NAME));
}

7.使用CassandraRepository进行数据访问

我们可以直接使用上面创建的BookRepository来持久化,操作和获取Cassandra数据库中的数据。

7.1。保存一本新书

我们可以将新书保存到我们的书店:

Book javaBook = <b>new</b> Book(
  UUIDs.timeBased(), <font>"Head First Java"</font><font>, </font><font>"O'Reilly Media"</font><font>, 
  ImmutableSet.of(</font><font>"Computer"</font><font>, </font><font>"Software"</font><font>));
bookRepository.save(ImmutableSet.of(javaBook));
</font>

然后我们可以检查数据库中插入的书的可用性:

Iterable<Book> books = bookRepository.findByTitleAndPublisher(
  <font>"Head First Java"</font><font>, </font><font>"O'Reilly Media"</font><font>);
assertEquals(javaBook.getId(), books.iterator().next().getId());
</font>

7.2。更新现有图书

Lat首先插入一本新书:

Book javaBook = <b>new</b> Book(
  UUIDs.timeBased(), <font>"Head First Java"</font><font>, </font><font>"O'Reilly Media"</font><font>, 
  ImmutableSet.of(</font><font>"Computer"</font><font>, </font><font>"Software"</font><font>));
bookRepository.save(ImmutableSet.of(javaBook));
</font>

让我们按标题取书:

Iterable<Book> books = bookRepository.findByTitleAndPublisher(
  <font>"Head First Java"</font><font>, </font><font>"O'Reilly Media"</font><font>);
</font>

然后让我们改变这本书的标题:

javaBook.setTitle(<font>"Head First Java Second Edition"</font><font>);
bookRepository.save(ImmutableSet.of(javaBook));
</font>

最后让我们检查标题是否在数据库中更新:

Iterable<Book> books = bookRepository.findByTitleAndPublisher(
  <font>"Head First Java Second Edition"</font><font>, </font><font>"O'Reilly Media"</font><font>);
assertEquals(
  javaBook.getTitle(), updateBooks.iterator().next().getTitle());
</font>

7.3。删除现有图书

插入一本新书:

Book javaBook = <b>new</b> Book(
  UUIDs.timeBased(), <font>"Head First Java"</font><font>, </font><font>"O'Reilly Media"</font><font>,
  ImmutableSet.of(</font><font>"Computer"</font><font>, </font><font>"Software"</font><font>));
bookRepository.save(ImmutableSet.of(javaBook));
</font>

然后删除新输入的书:

bookRepository.delete(javaBook);

现在我们可以检查删除:

Iterable<Book> books = bookRepository.findByTitleAndPublisher(
  <font>"Head First Java"</font><font>, </font><font>"O'Reilly Media"</font><font>);
assertNotEquals(javaBook.getId(), books.iterator().next().getId());
</font>

这将导致从代码中抛出NoSuchElementException,确保删除该书。

7.4。查找所有书籍

首先插入新书:

Book javaBook = <b>new</b> Book(
  UUIDs.timeBased(), <font>"Head First Java"</font><font>, </font><font>"O'Reilly Media"</font><font>, 
  ImmutableSet.of(</font><font>"Computer"</font><font>, </font><font>"Software"</font><font>));
Book dPatternBook = <b>new</b> Book(
  UUIDs.timeBased(), </font><font>"Head Design Patterns"</font><font>,</font><font>"O'Reilly Media"</font><font>,
  ImmutableSet.of(</font><font>"Computer"</font><font>, </font><font>"Software"</font><font>));
bookRepository.save(ImmutableSet.of(javaBook));
bookRepository.save(ImmutableSet.of(dPatternBook));
</font>

查找所有书籍:

Iterable<Book> books = bookRepository.findAll();

然后我们可以查看数据库中可用书籍的数量:

<b>int</b> bookCount = 0;
<b>for</b> (Book book : books) bookCount++;
assertEquals(bookCount, 2);

8.结论

我们使用最常用的CassandraRepository数据访问机制,使用Spring数据对Cassandra进行了基本的动手介绍。

上面的代码片段和示例的实现可以在 我的GitHub项目中 中找到- 这是一个基于Eclipse的项目,因此它应该很容易导入和运行。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

最愚蠢的一代

最愚蠢的一代

马克·鲍尔莱因 / 杨蕾 / 天津社会科学院出版社 / 2011-7 / 39.80元

《最愚蠢的一代》 美国大学教授的鲍尔莱恩认为,数码时代正在使美国的年轻一代成为知识最贫乏的一代人。 美国的青少年和年轻人正在被数码时代各种娱乐消遣性的工具所淹没。这些工具包括手机、社交网络和信息传送等等。他们通过这些工具传达的却是幼稚浮浅的东西,而且这些东西正在妨碍他们同历史、公民义务、国际事务和美术等成年人的现实世界进行重要的接触。 我们想当然地以为,这些善于吸收新技术的美国年......一起来看看 《最愚蠢的一代》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具