Introduktion til Spring Data Cassandra

1. Oversigt

Denne artikel er en praktisk introduktion til at arbejde med Cassandra med Spring Data.

Vi starter fra det grundlæggende og gennemgår konfigurationerne og kodningen og bygger endelig et komplet Spring Data Cassandra-modul.

2. Maven-afhængigheder

Lad os starte med at definere afhængighederne i pom.xml, med Maven:

 com.datastax.cassandra cassandra-driver-core 2.1.9 

3. Konfiguration til Cassandra

Vi bruger Java-konfigurationstil gennem hele dette til at konfigurere Cassandra-integrationen.

3.1. Hovedkonfigurationen

Lad os starte med hovedkonfigurationsklassen - naturligvis drevet via klasseniveau @Konfiguration kommentar:

@Configuration offentlig klasse CassandraConfig udvider AbstractCassandraConfiguration {@Override beskyttet String getKeyspaceName () {returner "testKeySpace"; } @Bean offentlig CassandraClusterFactoryBean-klynge () {CassandraClusterFactoryBean-klynge = ny CassandraClusterFactoryBean (); cluster.setContactPoints ("127.0.0.1"); cluster.setPort (9142); retur klynge; } @Bean public CassandraMappingContext cassandraMapping () kaster ClassNotFoundException {returner nye BasicCassandraMappingContext (); }}

Bemærk den nye bønne - BasicCassandraMappingContext - med en standardimplementering. Dette er nødvendigt for at kortlægge de vedvarende enheder mellem deres objekt og deres vedvarende formater.

Og da standardimplementeringen er i stand nok, kan vi bruge den direkte.

3.2. Cassandra-forbindelsesegenskaber

Der er tre obligatoriske indstillinger, vi skal konfigurere for at konfigurere forbindelsen til en Cassandra-klient.

Vi er nødt til at konfigurere det værtsnavn, som Cassandra-serveren kører som contactPoints. Havn er simpelthen lytteporten til anmodning på serveren. Nøglerum er navneområdet, der definerer datareplikering på noder, som er baseret på et Cassandra-relateret koncept.

4. Cassandra-arkivet

Vi skal bruge en Cassandra-lager til dataadgangslag. Dette følger Spring Data repository-abstraktion, som er fokuseret på at abstrahere den kode, der kræves for at implementere dataadgangslagene på tværs af forskellige persistensmekanismer.

4.1. Opret Cassandra-lager

Lad os oprette Cassandra-lager skal bruges i konfigurationen:

@Repository offentlig grænseflade BookRepository udvider CassandraRepository {//}

4.2. Konfiguration til Cassandra-lager

Nu kan vi udvide konfigurationen i afsnit 3.1 ved at tilføje @EnableCassandraRepositories kommentar på klasseniveau for at markere vores Cassandra-lager, oprettet i afsnit 4.1 i CassandraConfig:

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

5. Enheden

Lad os se hurtigt på enheden - den modelklasse, vi skal bruge. Klassen er kommenteret og definerer yderligere parametre til oprettelse af Cassandra-datatabellens metadata i integreret tilstand.

Ved brug af @Bord kommentar, bønnen kortlægges direkte til en Cassandra-datatabel. Hver egenskab er også defineret som en type primærnøgle eller en simpel kolonne:

@Table public class Book {@PrimaryKeyColumn (name = "isbn", ordinal = 2, type = PrimaryKeyType.CLUSTERED, ordering = Ordering.DESCENDING) private UUID id; @PrimaryKeyColumn (navn = "titel", ordinal = 0, type = PrimaryKeyType.PARTITIONED) privat streng titel; @PrimaryKeyColumn (name = "publisher", ordinal = 1, type = PrimaryKeyType.PARTITIONED) privat strengudgiver; @Column private Set tags = nyt HashSet (); // standard getters og setter}

6. Test med en integreret server

6.1. Maven afhængigheder

Hvis du vil køre Cassandra i integreret tilstand (uden manuelt at installere en separat Cassandra-server), skal du tilføje Cassandra-enhed relaterede afhængigheder til 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 

Det er muligt at brug en indlejret Cassandra-server til at teste denne applikation. Den største fordel er, at du ikke ønsker at installere Cassandra eksplicit.

Denne integrerede server er også kompatibel med Spring JUnit Tests. Her kan vi indstille SpringJUnit4ClassRunner ved brug af @RunWith kommentar sammen med den integrerede server. Så det er muligt at implementere en komplet testpakke uden at have en ekstern Cassandra-tjeneste kørende.

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (klasser = CassandraConfig.class) offentlig klasse BookRepositoryIntegrationTest {//}

6.2. Start og stop af serveren

Du kan ignorere dette afsnit, hvis du kører en ekstern Cassandra-server.

Vi er nødt til at starte serveren en gang for hele testpakken, så serverens startmetode er markeret med @BeforeClass kommentar:

@BeforeClass offentlig statisk ugyldig startCassandraEmbedded () {EmbeddedCassandraServerHelper.startEmbeddedCassandra (); Cluster cluster = Cluster.builder () .addContactPoints ("127.0.0.1"). WithPort (9142) .build (); Sessionssession = cluster.connect (); }

Dernæst skal vi sørge for, at serveren stoppes, efter at testpakken er udført:

@AfterClass offentlig statisk ugyldig stopCassandraEmbedded () {EmbeddedCassandraServerHelper.cleanEmbeddedCassandra (); }

6.3. Rengør datatabel

Det er god praksis at slippe og oprette datatabellen før hver testudførelse for at undgå uventede resultater på grund af de manipulerede data i tidligere testudførelser.

Nu kan vi oprette datatabellen, når serveren startes:

@Før offentligt ugyldigt createTable () {adminTemplate.createTable (true, CqlIdentifier.cqlId (DATA_TABLE_NAME), Book.class, ny HashMap ()); }

og slip efter hver enkelt eksekvering af testsag:

@Efter offentlig ugyldig dropTable () {adminTemplate.dropTable (CqlIdentifier.cqlId (DATA_TABLE_NAME)); }

7. Dataadgang ved hjælp Cassandra-lager

Vi kan bruge direkte BookRepository vi oprettede ovenfor for at fortsætte, manipulere og hente dataene i Cassandra-databasen.

7.1. Gem en ny bog

Vi kan gemme en ny bog i vores boghandel:

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

Derefter kan vi kontrollere tilgængeligheden af ​​den indsatte bog i databasen:

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

7.2. Opdater en eksisterende bog

Lat starter med at indsætte en ny bog:

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

Lad os hente bogen ved titlen:

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

Lad os derefter ændre bogens titel:

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

Lad os endelig kontrollere, om titlen er opdateret i databasen:

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

7.3. Slet den eksisterende bog

Indsæt en ny bog:

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

Slet derefter den nyindkomne bog:

bookRepository.delete (javaBook); 

Nu kan vi kontrollere for sletning:

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

Dette medfører at kaste et NoSuchElementException fra koden og sikre, at bogen slettes.

7.4. Find alle bøger

Indsæt først nye bøger:

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

Find alle bøger:

Iterable bøger = bookRepository.findAll ();

Derefter kan vi kontrollere antallet af tilgængelige bøger i databasen:

int bookCount = 0; for (Bogbog: bøger) bookCount ++; assertEquals (bookCount, 2);

8. Konklusion

Vi gennemgik en grundlæggende praktisk introduktion til Cassandra med Spring-data ved hjælp af den mest almindelige tilgang ved hjælp af Cassandra-lager dataadgangsmekanisme.

Implementeringen af ​​ovenstående kodestykker og eksempler findes i mit GitHub-projekt - dette er et Eclipse-baseret projekt, så det skal være let at importere og køre som det er.


$config[zx-auto] not found$config[zx-overlay] not found