Рубрики
Без рубрики

Введение в весенние данные Кассандра

Быстрое практическое введение в использование Spring Data Cassandra для чистого хранения данных на сервере Cassandra.

Автор оригинала: baeldung.

1. Обзор

Эта статья является практическим введением в работу с Cassandra с весенними данными.

Мы начнем с основ и пройдемся по конфигурациям и кодированию, окончательно наберем полный модуль Spring Data Cassandra.

2. Мейвен зависимостей

Начнем с определения зависимостей в пом.xml , с Maven:


    com.datastax.cassandra
    cassandra-driver-core
    2.1.9

3. Конфигурация для Кассандры

Мы будем использовать java-стиль конфигурации во всем этом вполне для настройки интеграции Cassandra.

3.1. Главная конфиг

Начнем с основного класса конфигурации – конечно, по пути обучения на уровне @Configuration аннотация:

@Configuration
public class CassandraConfig extends AbstractCassandraConfiguration {

    @Override
    protected String getKeyspaceName() {
        return "testKeySpace";
    }

    @Bean
    public CassandraClusterFactoryBean cluster() {
        CassandraClusterFactoryBean cluster = 
          new CassandraClusterFactoryBean();
        cluster.setContactPoints("127.0.0.1");
        cluster.setPort(9142);
        return cluster;
    }

    @Bean
    public CassandraMappingContext cassandraMapping() 
      throws ClassNotFoundException {
        return new BasicCassandraMappingContext();
    }
}

Обратите внимание на новую фасоль – BasicCassandraMappingContext – с реализацией по умолчанию. Это необходимо для карты стойких сущностей между объектом и их постоянными форматами.

И поскольку реализация по умолчанию достаточно способна, мы можем использовать ее напрямую.

3.2. Свойства подключения Кассандры

Есть три обязательных параметра, которые мы должны настроить для настройки соединения для клиента Cassandra.

Мы должны настроить имя хоста, которое сервер Cassandra работает как c ontactPoints. Порт это просто порт прослушивания запроса на сервере. KeyspaceИмя это пространство имен, которое определяет репликацию данных на узлах, которая основана на концепции, связанной с Cassandra.

4. Хранилище Кассандры

Мы собираемся использовать КассандраРепозиторий для уровня доступа к данным. Этот следует абстракции репозитория весенних данных, которая направлена на абстрагирование кода, необходимого для реализации уровней доступа к данным в различных механизмах сохранения.

4.1. Создать CassandraRepository

Давайте создадим КассандраРепозиторий для использования в конфигурации:

@Repository
public interface BookRepository extends CassandraRepository {
    //
}

4.2. Конфигурация для CassandraRepository

Теперь мы можем расширить конфигурацию в разделе 3.1, добавив @EnableCassandraRepositories аннотация уровня класса в ознаменование нашего хранилища Cassandra, созданного в разделе 4.1 в КассандраКонфиг:

@Configuration
@EnableCassandraRepositories(
  basePackages = "com.baeldung.spring.data.cassandra.repository")
public class CassandraConfig extends AbstractCassandraConfiguration {
    //
}

5. Сущность

Давайте кратко рассмотрим сущность — класс моделей, который мы будем использовать. Класс аннотирован и определяет дополнительные параметры для создания таблицы данных Cassandra в встроенном режиме.

использование @Table аннотация, фасоль непосредственно отображается в таблице данных Cassandra. Также каждое свойство определяется как тип основного ключа или простой столбец:

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

6. Тестирование со встроенным сервером

6.1. Зависимость от Maven

Если вы хотите запустить Cassandra во встроенном режиме (без ручной установки отдельного сервера Cassandra), вам нужно добавить Кассандра-единица связанных зависимостей от пом.xml :


    org.cassandraunit
    cassandra-unit-spring
    2.1.9.2
    test
    
        
        org.cassandraunit
        cassandra-unit
        
    


    org.cassandraunit
    cassandra-unit-shaded
    2.1.9.2
    test


    org.hectorclient
    hector-core
    2.0-0

Можно использовать встроенный сервер Cassandra для тестирования этого приложения . Основным преимуществом является то, что вы не хотите, чтобы установить Кассандра явно.

Этот встроенный сервер совместим с Spring JUnit Tests. Здесь мы можем установить СпрингДжунит4КлассРаннер использование @RunWith аннотация вместе со встроенным сервером. Таким образом, можно реализовать полный набор тестов без запуска внешнего сервиса Cassandra.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CassandraConfig.class)
public class BookRepositoryIntegrationTest {
    //
}

6.2. Запуск и остановка сервера

Вы можете проигнорировать этот раздел, если вы работаете с внешним сервером Cassandra.

Мы должны начать сервер один раз для всего набора тестов, так что метод запуска сервера отмечен @BeforeClass аннотация:

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

Далее мы должны убедиться, что сервер остановлен после завершения выполнения тестового набора:

@AfterClass
public static void stopCassandraEmbedded() {
    EmbeddedCassandraServerHelper.cleanEmbeddedCassandra();
}

6.3. Таблица чистых данных

Это хорошая практика, чтобы отказаться и создать таблицу данных перед каждым выполнением теста, чтобы избежать неожиданных результатов из-за манипулируемых данных в предыдущих тестовых исполнениях.

Теперь мы можем создать таблицу данных по мере начала работы сервера:

@Before
public void createTable() {
    adminTemplate.createTable(
      true, CqlIdentifier.cqlId(DATA_TABLE_NAME), 
      Book.class, new HashMap());
}

и падение после каждого выполнения тестового случая:

@After
public void dropTable() {
    adminTemplate.dropTable(CqlIdentifier.cqlId(DATA_TABLE_NAME));
}

7. Доступ к данным с помощью CassandraRepository

Мы можем непосредственно использовать BookRepository мы создали выше, чтобы сохранять, манипулировать и получать данные в базе данных Cassandra.

7.1. Сохранить новую книгу

Мы можем сохранить новую книгу в нашем книжном магазине:

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

Затем мы можем проверить наличие вставленной книги в базу данных:

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

7.2. Обновление существующей книги

Lat’s начать с вставки новой книги:

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

Давайте возьмем книгу по названию:

Iterable books = bookRepository.findByTitleAndPublisher(
  "Head First Java", "O'Reilly Media");

Тогда давайте изменим название книги:

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

Наконец, давайте проверим, обновляется ли название в базе данных:

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

7.3. Удалить существующую книгу

Вставьте новую книгу:

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

Затем удалите недавно введенную книгу:

bookRepository.delete(javaBook);

Теперь мы можем проверить на удаление:

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

Это приведет к выбросу NoSuchElementException из кода, убедившись, что книга удалена.

7.4. Найти все книги

Сначала вставьте новые книги:

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

Найти все книги:

Iterable books = bookRepository.findAll();

Тогда мы можем проверить его количество доступных книг в базе данных:

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

8. Заключение

Мы прошли через основные практические введение в Cassandra с весенними данными, используя наиболее распространенный подход, используя КассандраРепозиторий механизм доступа к данным.

Реализация вышеуказанных фрагментов и примеров кода можно найти в мой проект GitHub – это проект на основе Eclipse, поэтому он должен быть легким для импорта и запуска, как она есть.