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.