Inleiding tot Spring Data Cassandra

1. Overzicht

Dit artikel is een praktische inleiding tot het werken met Cassandra met Spring Data.

We beginnen bij de basis en nemen de configuraties en codering door, en bouwen uiteindelijk een complete Spring Data Cassandra-module op.

2. Maven afhankelijkheden

Laten we beginnen met het definiëren van de afhankelijkheden in het pom.xml, met Maven:

 com.datastax.cassandra cassandra-driver-core 2.1.9 

3. Configuratie voor Cassandra

We zullen gedurende dit hele proces de Java-configuratiestijl gebruiken om de Cassandra-integratie te configureren.

3.1. De belangrijkste configuratie

Laten we beginnen met de hoofdconfiguratieklasse - natuurlijk aangestuurd via het klassenniveau @Configuratie annotatie:

@Configuration openbare klasse CassandraConfig breidt AbstractCassandraConfiguration uit {@Override beschermde String getKeyspaceName () {retourneer "testKeySpace"; } @Bean openbare CassandraClusterFactoryBean cluster () {CassandraClusterFactoryBean cluster = nieuwe CassandraClusterFactoryBean (); cluster.setContactPoints ("127.0.0.1"); cluster.setPort (9142); terugkeercluster; } @Bean openbare CassandraMappingContext cassandraMapping () gooit ClassNotFoundException {retourneer nieuwe BasicCassandraMappingContext (); }}

Let op de nieuwe boon - BasicCassandraMappingContext - met een standaardimplementatie. Dit is vereist om de persistente entiteiten tussen hun object en hun persistente formaten in kaart te brengen.

En aangezien de standaardimplementatie capabel genoeg is, kunnen we deze direct gebruiken.

3.2. Cassandra-verbindingseigenschappen

Er zijn drie verplichte instellingen die we moeten configureren om de verbinding voor een Cassandra-client in te stellen.

We moeten de hostnaam instellen die de Cassandra-server draait als contactPoints. Haven is gewoon de luisterpoort voor het verzoek in de server. Sleutelruimtenaam is de naamruimte die de gegevensreplicatie op knooppunten definieert, die is gebaseerd op een Cassandra-gerelateerd concept.

4. De Cassandra-opslagplaats

We gaan een CassandraRepository voor gegevenstoegangslaag. Dit volgt op de abstractie van de Spring Data-repository, die is gericht op het abstraheren van de code die nodig is om de gegevenstoegangslagen te implementeren over verschillende persistentiemechanismen.

4.1. Maak het CassandraRepository

Laten we de CassandraRepository te gebruiken in de configuratie:

@Repository openbare interface BookRepository breidt CassandraRepository uit {//}

4.2. Configuratie voor CassandraRepository

Nu kunnen we de configuratie in Paragraaf 3.1 uitbreiden door @EnableCassandraRepositories annotatie op klasniveau om onze Cassandra-repository te markeren die is gemaakt in sectie 4.1 in Cassandra Configureren:

@Configuration @EnableCassandraRepositories (basePackages = "com.baeldung.spring.data.cassandra.repository") openbare klasse CassandraConfig breidt AbstractCassandraConfiguration {//} uit

5. De entiteit

Laten we de entiteit even bekijken: de modelklasse die we gaan gebruiken. De klasse is geannoteerd en definieert aanvullende parameters voor het maken van de Cassandra-gegevenstabel met metagegevens in de ingesloten modus.

Gebruik makend van @Tafel annotatie, wordt de bean direct toegewezen aan een Cassandra-gegevenstabel. Elke eigenschap wordt ook gedefinieerd als een type primaire sleutel of een eenvoudige kolom:

@Table public class Book {@PrimaryKeyColumn (name = "isbn", ordinal = 2, type = PrimaryKeyType.CLUSTERED, order = Ordering.DESCENDING) privé UUID-id; @PrimaryKeyColumn (name = "title", ordinal = 0, type = PrimaryKeyType.PARTITIONED) private String-titel; @PrimaryKeyColumn (name = "publisher", ordinal = 1, type = PrimaryKeyType.PARTITIONED) private String publisher; @Column private Set-tags = nieuwe HashSet (); // standaard getters en setters}

6. Testen met een embedded server

6.1. Afhankelijkheden van Maven

Als je Cassandra in embedded modus wilt draaien (zonder handmatig een aparte Cassandra-server te installeren), moet je het cassandra-eenheid gerelateerde afhankelijkheden aan het 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 

Het is mogelijk om gebruik een ingebouwde Cassandra-server om deze applicatie te testen. Het belangrijkste voordeel is dat u Cassandra niet expliciet wilt installeren.

Deze embedded server is ook compatibel met Spring JUnit Tests. Hier kunnen we instellen SpringJUnit4ClassRunner gebruik makend van @Rennen met annotatie samen met de ingesloten server. Het is dus mogelijk om een ​​complete testsuite te implementeren zonder een externe Cassandra-service te laten draaien.

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

6.2. De server starten en stoppen

U kunt deze sectie negeren als u een externe Cassandra-server gebruikt.

We moeten de server één keer starten voor de hele testsuite, dus de startmethode van de server is gemarkeerd met @Voor klas annotatie:

@BeforeClass openbare statische leegte startCassandraEmbedded () {EmbeddedCassandraServerHelper.startEmbeddedCassandra (); Clustercluster = Cluster.builder () .addContactPoints ("127.0.0.1"). WithPort (9142) .build (); Sessiesessie = cluster.connect (); }

Vervolgens moeten we ervoor zorgen dat de server wordt gestopt na het voltooien van de uitvoering van de testsuite:

@AfterClass openbare statische leegte stopCassandraEmbedded () {EmbeddedCassandraServerHelper.cleanEmbeddedCassandra (); }

6.3. Schone gegevenstabel

Het is een goede gewoonte om de gegevenstabel voor elke testuitvoering te laten vallen en aan te maken, om onverwachte resultaten te vermijden vanwege de gemanipuleerde gegevens in eerdere testuitvoeringen.

Nu kunnen we de gegevenstabel maken terwijl de server wordt gestart:

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

en laten vallen na elke uitvoering van een testcase:

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

7. Gegevenstoegang met behulp van CassandraRepository

We kunnen de BookRepository we hebben hierboven gemaakt om de gegevens in de Cassandra-database te behouden, te manipuleren en op te halen.

7.1. Sla een nieuw boek op

We kunnen een nieuw boek opslaan in onze boekwinkel:

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

Vervolgens kunnen we de beschikbaarheid van het ingevoegde boek in de database controleren:

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

7.2. Werk een bestaand boek bij

Lat's begint met het invoegen van een nieuw boek:

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

Laten we het boek ophalen op titel:

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

Laten we dan de titel van het boek veranderen:

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

Laten we tot slot kijken of de titel is bijgewerkt in de database:

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

7.3. Verwijder het bestaande boek

Voeg een nieuw boek in:

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

Verwijder vervolgens het nieuw ingevoerde boek:

bookRepository.delete (javaBook); 

Nu kunnen we de verwijdering controleren:

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

Dit zorgt ervoor dat er een NoSuchElementException uit de code wordt gegenereerd om ervoor te zorgen dat het boek wordt verwijderd.

7.4. Vind alle boeken

Voeg eerst een nieuw boek in:

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

Vind alle boeken:

Herhaalbare boeken = bookRepository.findAll ();

Dan kunnen we het aantal beschikbare boeken in de database bekijken:

int bookCount = 0; voor (Boek boek: boeken) bookCount ++; assertEquals (bookCount, 2);

8. Conclusie

We hebben een eenvoudige praktische introductie doorlopen van de Cassandra met Spring-gegevens met behulp van de meest gebruikelijke benadering CassandraRepository mechanisme voor gegevenstoegang.

De implementatie van de bovenstaande codefragmenten en voorbeelden is te vinden in mijn GitHub-project - dit is een op Eclipse gebaseerd project, dus het zou gemakkelijk te importeren en uit te voeren moeten zijn zoals het is.