Introduksjon til Spring Data Cassandra

1. Oversikt

Denne artikkelen er en praktisk introduksjon til å samarbeide med Cassandra med Spring Data.

Vi starter fra det grunnleggende og går gjennom konfigurasjonene og kodingen, og til slutt bygger vi opp en komplett Spring Data Cassandra-modul.

2. Maven-avhengigheter

La oss starte med å definere avhengighetene i pom.xml, med Maven:

 com.datastax.cassandra cassandra-driver-core 2.1.9 

3. Konfigurasjon for Cassandra

Vi bruker Java-konfigurasjonsstilen gjennom dette for å konfigurere Cassandra-integrasjonen.

3.1. Hovedkonfigurasjonen

La oss starte med hovedkonfigurasjonsklassen - selvfølgelig drevet via klassenivå @Konfigurasjon kommentar:

@Configuration offentlig klasse CassandraConfig utvider AbstractCassandraConfiguration {@Override-beskyttet streng getKeyspaceName () {return "testKeySpace"; } @Bean public CassandraClusterFactoryBean cluster () {CassandraClusterFactoryBean cluster = new CassandraClusterFactoryBean (); cluster.setContactPoints ("127.0.0.1"); cluster.setPort (9142); retur klynge; } @Bean public CassandraMappingContext cassandraMapping () kaster ClassNotFoundException {return new BasicCassandraMappingContext (); }}

Legg merke til den nye bønnen - BasicCassandraMappingContext - med standardimplementering. Dette kreves for å kartlegge de vedvarende enhetene mellom objektet og deres vedvarende formater.

Og ettersom standardimplementeringen er i stand nok, kan vi bruke den direkte.

3.2. Cassandra Connection Properties

Det er tre obligatoriske innstillinger vi må konfigurere for å sette opp tilkoblingen for en Cassandra-klient.

Vi må sette opp vertsnavnet som Cassandra-serveren kjører som contactPoints. Havn er ganske enkelt lytteporten for forespørsel på serveren. KeyspaceName er navneområdet som definerer datareplikering på noder, som er basert på et Cassandra-relatert konsept.

4. Cassandra Repository

Vi skal bruke en CassandraRepository for datatilgangslag. Dette følger Spring Data repository-abstraksjonen, som er fokusert på å abstrahere koden som kreves for å implementere datatilgangslagene på tvers av forskjellige utholdenhetsmekanismer.

4.1. Opprett CassandraRepository

La oss lage CassandraRepository som skal brukes i konfigurasjonen:

@Repository offentlige grensesnitt BookRepository utvider CassandraRepository {//}

4.2. Konfigurasjon for CassandraRepository

Nå kan vi utvide konfigurasjonen i avsnitt 3.1, og legge til @EnableCassandraRepositories klassenivåkommentar for å markere Cassandra Repository opprettet i avsnitt 4.1 i CassandraConfig:

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

5. Enheten

La oss se raskt på enheten - modellklassen vi skal bruke. Klassen er kommentert og definerer tilleggsparametere for oppretting av metadata Cassandra-datatabell i innebygd modus.

Ved hjelp av @Bord kommentar, bønnen blir direkte kartlagt til en Cassandra-datatabell. Hver egenskap er også definert som en type primærnøkkel eller en enkel kolonne:

@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 streng tittel; @PrimaryKeyColumn (name = "publisher", ordinal = 1, type = PrimaryKeyType.PARTITIONED) private String publisher; @Column private Set tags = new HashSet (); // standard getters og setters}

6. Testing med en innebygd server

6.1. Maven avhengigheter

Hvis du vil kjøre Cassandra i innebygd modus (uten å installere en separat Cassandra-server manuelt), må du legge til kassandra-enhet relaterte avhengigheter 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 mulig å bruk en innebygd Cassandra-server for å teste dette programmet. Den største fordelen er at du ikke vil installere Cassandra eksplisitt.

Denne innebygde serveren er også kompatibel med Spring JUnit-tester. Her kan vi sette SpringJUnit4ClassRunner ved hjelp av @RunWith kommentar sammen med den innebygde serveren. Så det er mulig å implementere en komplett testpakke uten å ha en ekstern Cassandra-tjeneste i gang.

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

6.2. Starte og stoppe serveren

Du kan ignorere denne delen hvis du kjører en ekstern Cassandra-server.

Vi må starte serveren en gang for hele testpakken, så serverstartmetoden er merket med @BeforeClass kommentar:

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

Deretter må vi sørge for at serveren stoppes etter at testpakken er fullført:

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

6.3. Rengjør datatabellen

Det er god praksis å slippe og opprette datatabellen før hver testutførelse, for å unngå uventede resultater på grunn av manipulerte data i tidligere testutførelser.

Nå kan vi opprette datatabellen når serveren startes:

@Før offentlig ugyldig createTable () {adminTemplate.createTable (true, CqlIdentifier.cqlId (DATA_TABLE_NAME), Book.class, new HashMap ()); }

og slipp etter hver eneste prøvesakskjøring:

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

7. Datatilgang ved hjelp CassandraRepository

Vi kan direkte bruke BookRepository vi opprettet ovenfor for å vedvare, manipulere og hente dataene i Cassandra-databasen.

7.1. Lagre en ny bok

Vi kan lagre en ny bok i bokhandelen vår:

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

Deretter kan vi sjekke tilgjengeligheten til den innsatte boken i databasen:

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

7.2. Oppdater en eksisterende bok

Lat begynner med å sette inn en ny bok:

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

La oss hente boka etter tittelen:

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

La oss så endre tittelen på boken:

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

Til slutt, la oss sjekke om tittelen er oppdatert i databasen:

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

7.3. Slett den eksisterende boken

Sett inn en ny bok:

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

Slett deretter den nylig innlagte boken:

bookRepository.delete (javaBook); 

Nå kan vi se etter sletting:

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

Dette vil føre til at du kaster et NoSuchElementException fra koden og sørger for at boken blir slettet.

7.4. Finn alle bøker

Sett inn nye bøker først:

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));

Finn alle bøker:

Iterable books = bookRepository.findAll ();

Deretter kan vi sjekke antall tilgjengelige bøker i databasen:

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

8. Konklusjon

Vi gikk gjennom en grunnleggende praktisk introduksjon til Cassandra med vårdata ved hjelp av den vanligste tilnærmingen CassandraRepository datatilgangsmekanisme.

Implementeringen av ovennevnte kodebiter og eksempler finner du i GitHub-prosjektet mitt - dette er et formørkelsesbasert prosjekt, så det skal være enkelt å importere og kjøre som det er.


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