Uvod u proljetne podatke Cassandra

1. Pregled

Ovaj je članak praktični uvod u rad s Cassandrom s Spring Data.

Krenut ćemo od osnova i proći ćemo kroz konfiguracije i kodiranje, konačno gradeći cjeloviti modul Spring Data Cassandra.

2. Ovisnosti Mavena

Počnimo s definiranjem ovisnosti u pom.xml, s Mavenom:

 com.datastax.cassandra cassandra-driver-core 2.1.9 

3. Konfiguracija za Cassandru

Kroz ovo ćemo sasvim koristiti Java konfiguracijski stil za konfiguriranje integracije Cassandre.

3.1. Glavna konfiguracija

Počnimo s glavnom konfiguracijskom klasom - naravno vođenom preko razine klase @Konfiguracija napomena:

@Configuration javna klasa CassandraConfig proširuje AbstractCassandraConfiguration {@Override zaštićeni niz getKeyspaceName () {return "testKeySpace"; } @Bean public CassandraClusterFactoryBean cluster () {CassandraClusterFactoryBean cluster = new CassandraClusterFactoryBean (); cluster.setContactPoints ("127.0.0.1"); cluster.setPort (9142); povratna skupina; } @Bean public CassandraMappingContext cassandraMapping () baca ClassNotFoundException {return new BasicCassandraMappingContext (); }}

Primijetite novi grah - BasicCassandraMappingContext - sa zadanom implementacijom. To je potrebno za mapiranje trajnih entiteta između njihovog objekta i njihovih trajnih formata.

A kako je zadana implementacija dovoljno sposobna, možemo je izravno koristiti.

3.2. Svojstva veze Cassandra

Tri su obvezne postavke koje moramo konfigurirati za postavljanje veze za klijenta Cassandre.

Moramo postaviti ime hosta da se poslužitelj Cassandra izvodi kao contactPoints. Luka je jednostavno priključak za slušanje zahtjeva na poslužitelju. Ime tipke je prostor imena koji definira replikaciju podataka na čvorovima, a koji se temelji na konceptu povezanom s Cassandrom.

4. Repozitorij Cassandra

Koristit ćemo a Repozitorij Cassandra za sloj pristupa podacima. To slijedi apstrakciju spremišta podataka Spring, koja je usredotočena na apstrahiranje koda potrebnog za implementaciju slojeva pristupa podacima u različitim mehanizmima trajanja.

4.1. Stvorite Repozitorij Cassandra

Stvorimo Repozitorij Cassandra koji će se koristiti u konfiguraciji:

@Repository javno sučelje BookRepository proširuje CassandraRepository {//}

4.2. Konfiguracija za Repozitorij Cassandra

Sada možemo dodati konfiguraciju u odjeljak 3.1 @EnableCassandraRepositories napomena na razini razreda za obilježavanje našeg Cassandra Repozitorija stvorenog u odjeljku 4.1 CassandraConfig:

@Configuration @EnableCassandraRepositories (basePackages = "com.baeldung.spring.data.cassandra.repository") javna klasa CassandraConfig proširuje AbstractCassandraConfiguration {//}

5. Entitet

Kratko ćemo pogledati entitet - klasu modela koju ćemo koristiti. Klasa je označena i definira dodatne parametre za stvaranje metapodataka Cassandra tablice podataka u ugrađenom načinu rada.

Koristeći @Stol napomena, grah se izravno preslikava u tablicu podataka Cassandre. Također je svako svojstvo definirano kao vrsta primarnog ključa ili jednostavni stupac:

Knjiga javnih tablica @Table {@PrimaryKeyColumn (name = "isbn", redni = 2, type = PrimaryKeyType.CLUSTERED, ordering = Ordering.DESCENDING) private UUID id; @PrimaryKeyColumn (name = "title", redni = 0, type = PrimaryKeyType.PARTITIONED) private String title; @PrimaryKeyColumn (name = "publisher", redni = 1, type = PrimaryKeyType.PARTITIONED) private String izdavač; Oznake privatnog skupa stupca = novi HashSet (); // standardni geteri i postavljači}

6. Testiranje s ugrađenim poslužiteljem

6.1. Ovisnosti Mavena

Ako želite pokrenuti Cassandru u ugrađenom načinu rada (bez ručnog instaliranja zasebnog poslužitelja Cassandre), morate dodati kasandra-jedinica povezane ovisnosti o 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 

Moguće je upotrijebite ugrađeni Cassandrin poslužitelj za testiranje ove aplikacije. Glavna prednost je što ne želite eksplicitno instalirati Cassandru.

Ovaj ugrađeni poslužitelj kompatibilan je i s Spring JUnit testovima. Ovdje možemo postaviti SpringJUnit4ClassRunner koristeći @RunWith napomena zajedno s ugrađenim poslužiteljem. Tako je moguće implementirati kompletni testni paket bez pokretanja vanjske usluge Cassandra.

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

6.2. Pokretanje i zaustavljanje poslužitelja

Ovaj odjeljak možete zanemariti ako imate vanjski poslužitelj Cassandra.

Moramo pokrenuti poslužitelj jednom za cijeli testni paket, tako da je način pokretanja poslužitelja označen s @BeforeClass napomena:

@BeforeClass public static void startCassandraEmbedded () {EmbeddedCassandraServerHelper.startEmbeddedCassandra (); Klaster klastera = Cluster.builder () .addContactPoints ("127.0.0.1"). WithPort (9142) .build (); Sjednica sesije = cluster.connect (); }

Dalje moramo biti sigurni da je poslužitelj zaustavljen nakon završetka izvršenja test paketa:

@AfterClass public static void stopCassandraEmbedded () {EmbeddedCassandraServerHelper.cleanEmbeddedCassandra (); }

6.3. Tablica čistih podataka

Dobra je praksa ispuštati i stvarati tablicu podataka prije svakog izvođenja testa, kako bi se izbjegli neočekivani rezultati zbog manipuliranih podataka u ranijim izvršenjima testa.

Sada možemo stvoriti tablicu podataka kako je poslužitelj pokrenut:

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

i ispustite nakon svakog izvršenja pojedinačnog test slučaja:

@Nakon javne void dropTable () {adminTemplate.dropTable (CqlIdentifier.cqlId (DATA_TABLE_NAME)); }

7. Korištenje pristupa podacima Repozitorij Cassandra

Možemo izravno koristiti Repozitorij knjiga stvorili smo gore da bismo ustrajali, manipulirali i dohvatili podatke u bazi podataka Cassandra.

7.1. Spremi novu knjigu

Novu knjigu možemo spremiti u našu knjižaru:

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

Tada možemo provjeriti dostupnost umetnute knjige u bazi podataka:

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

7.2. Ažurirajte postojeću knjigu

Lat započinje umetanjem nove knjige:

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

Dohvatimo knjigu po naslovu:

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

Zatim promijenimo naslov knjige:

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

Na kraju provjerimo je li naslov ažuriran u bazi podataka:

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

7.3. Izbrišite postojeću knjigu

Umetnite novu knjigu:

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

Zatim izbrišite novounesenu knjigu:

bookRepository.delete (javaBook); 

Sada možemo provjeriti brisanje:

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

To će uzrokovati izbacivanje NoSuchElementException iz koda pazeći da je knjiga izbrisana.

7.4. Pronađi sve knjige

Prvo umetnite nove knjige:

Book javaBook = nova knjiga (UUIDs.timeBased (), "Head First Java", "O'Reilly Media", ImmutableSet.of ("Computer", "Software")); Book dPatternBook = nova knjiga (UUIDs.timeBased (), "Obrasci dizajna glave", "O'Reilly Media", ImmutableSet.of ("Računalo", "Softver")); bookRepository.save (ImmutableSet.of (javaBook)); bookRepository.save (ImmutableSet.of (dPatternBook));

Nađi sve knjige:

Knjige za čitanje = bookRepository.findAll ();

Tada možemo provjeriti broj dostupnih knjiga u bazi podataka:

int bookCount = 0; za (Knjiga knjiga: knjige) bookCount ++; assertEquals (bookCount, 2);

8. Zaključak

Prošli smo kroz osnovno praktično upoznavanje Cassandre s proljetnim podacima koristeći najčešći korišteni pristup Repozitorij Cassandra mehanizam za pristup podacima.

Implementacija gornjih isječaka koda i primjeri mogu se naći u mom GitHub projektu - ovo je projekt zasnovan na Eclipseu, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.