Въведение в Spring Data Cassandra

1. Общ преглед

Тази статия е практическо въведение в работата с Касандра с Spring Data.

Ще започнем от основите и ще преминем през конфигурациите и кодирането, като накрая ще изградим пълен модул Spring Data Cassandra.

2. Зависимости на Maven

Нека започнем с дефиниране на зависимостите в pom.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. Портът е просто портът за слушане на заявка в сървъра. KeyspaceName е пространството от имена, което определя репликацията на данни на възли, което се основава на концепция, свързана с Cassandra.

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

Ще използваме CassandraRepository за слой за достъп до данни. Това следва абстракцията на хранилището Spring Data, която е фокусирана върху абстрахирането на кода, необходим за внедряване на слоевете за достъп до данни в различни механизми за постоянство.

4.1. Създайте CassandraRepository

Нека създадем CassandraRepository, който да се използва в конфигурацията:

@Repository public interface BookRepository extends CassandraRepository { // }

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

Сега можем да разширим конфигурацията в раздел 3.1, добавяйки анотация на ниво клас @EnableCassandraRepositories, за да маркираме нашето хранилище Cassandra, създадено в раздел 4.1 в CassandraConfig:

@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 сървър), трябва да добавите свързаните с cassandra единица зависимости към pom.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, за да тествате това приложение . Основното предимство е, че не искате да инсталирате Cassandra изрично.

Този вграден сървър е съвместим и с Spring JUnit Tests. Тук можем да зададем SpringJUnit4ClassRunner, като използваме @RunWith анотация заедно с вградения сървър. Така че е възможно да се приложи пълен тестов пакет, без да се изпълнява външна услуга Cassandra.

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

6.2. Стартиране и спиране на сървъра

Можете да игнорирате този раздел, ако използвате външен сървър на Касандра.

Трябва да стартираме сървъра веднъж за целия тестов пакет, така че методът за стартиране на сървъра е маркиран с анотация @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 start с вмъкване на нова книга:

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 с данните Spring, използвайки най-често използвания подход, използвайки механизма за достъп до данни CassandraRepository .

Прилагането на горните кодови фрагменти и примери може да бъде намерено в моя проект GitHub - това е проект, базиран на Eclipse, така че трябва да е лесно да се импортира и да се изпълнява както е.