Pengenalan Spring Data Cassandra

1. Gambaran keseluruhan

Artikel ini adalah pengenalan praktikal untuk bekerja dengan Cassandra dengan Spring Data.

Kami akan memulakan dari asas dan menjalani konfigurasi dan pengekodan, akhirnya membina modul Spring Data Cassandra yang lengkap.

2. Pergantungan Maven

Mari mulakan dengan menentukan kebergantungan dalam pom.xml , dengan Maven:

 com.datastax.cassandra cassandra-driver-core 2.1.9 

3. Konfigurasi untuk Cassandra

Kami akan menggunakan konfigurasi gaya Java selama ini untuk mengkonfigurasi integrasi Cassandra.

3.1. Konfigurasi Utama

Mari kita mulakan dengan kelas konfigurasi utama - tentu saja didorong melalui anotasi tahap @ Konfigurasi :

@Configuration public class CassandraConfig extends AbstractCassandraConfiguration { @Override protected String getKeyspaceName() { return "testKeySpace"; } @Bean public CassandraClusterFactoryBean cluster() { CassandraClusterFactoryBean cluster = new CassandraClusterFactoryBean(); cluster.setContactPoints("127.0.0.1"); cluster.setPort(9142); return cluster; } @Bean public CassandraMappingContext cassandraMapping() throws ClassNotFoundException { return new BasicCassandraMappingContext(); } }

Perhatikan kacang baru - BasicCassandraMappingContext - dengan pelaksanaan lalai. Ini diperlukan untuk memetakan entiti berterusan antara objek mereka dan format berterusan mereka.

Dan kerana pelaksanaan lalai cukup mampu, kita dapat menggunakannya secara langsung.

3.2. Ciri Sambungan Cassandra

Terdapat tiga tetapan wajib yang harus kita konfigurasikan untuk mengatur sambungan untuk klien Cassandra.

Kita harus menyediakan nama host yang dijalankan oleh pelayan Cassandra sebagai c ontactPoints. Port hanyalah port pendengaran untuk permintaan di pelayan. KeyspaceName adalah ruang nama yang menentukan replikasi data pada node, yang berdasarkan konsep berkaitan Cassandra.

4. Repositori Cassandra

Kami akan menggunakan CassandraRepository untuk lapisan akses data. Ini mengikuti abstraksi repositori Spring Data, yang difokuskan pada abstrak kod yang diperlukan untuk menerapkan lapisan akses data di berbagai mekanisme ketekunan yang berbeza.

4.1. Buat CassandraRepository

Mari buat CassandraRepository untuk digunakan dalam konfigurasi:

@Repository public interface BookRepository extends CassandraRepository { // }

4.2. Konfigurasi untuk CassandraRepository

Sekarang, kita dapat memperluas konfigurasi di Bahagian 3.1, dengan menambahkan anotasi tahap kelas @EnableCassandraRepositories untuk menandakan Cassandra Repository kami yang dibuat dalam bahagian 4.1 di CassandraConfig:

@Configuration @EnableCassandraRepositories( basePackages = "com.baeldung.spring.data.cassandra.repository") public class CassandraConfig extends AbstractCassandraConfiguration { // }

5. Entiti

Mari kita lihat entiti - kelas model yang akan kita gunakan. Kelas diberi penjelasan dan menentukan parameter tambahan untuk pembuatan jadual data metadata Cassandra dalam mod tertanam.

Menggunakan anotasi @Table , kacang dipetakan secara langsung ke jadual data Cassandra. Juga setiap harta ditakrifkan sebagai jenis kunci utama atau lajur sederhana:

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

6. Menguji dengan Pelayan Terbenam

6.1. Ketergantungan Maven

Sekiranya anda ingin menjalankan Cassandra dalam mod tertanam (tanpa memasang pelayan Cassandra secara berasingan), anda perlu menambahkan pergantungan yang berkaitan dengan unit cassandra ke 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 

Anda boleh menggunakan pelayan Cassandra tertanam untuk menguji aplikasi ini . Kelebihan utamanya ialah anda tidak mahu memasang Cassandra secara eksplisit.

Pelayan terbenam ini serasi dengan Ujian Spring JUnit juga. Di sini kita boleh menetapkan SpringJUnit4ClassRunner menggunakan anotasi @RunWith bersama-sama dengan pelayan terbenam. Oleh itu, mungkin untuk melaksanakan rangkaian ujian lengkap tanpa perkhidmatan Cassandra luaran berjalan.

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

6.2. Memulakan dan Menghentikan Pelayan

Anda boleh mengabaikan bahagian ini jika anda menjalankan pelayan Cassandra luaran.

Kita harus memulakan pelayan sekali untuk keseluruhan rangkaian ujian, jadi kaedah permulaan pelayan ditandai dengan anotasi @BeforeClass :

@BeforeClass public static void startCassandraEmbedded() { EmbeddedCassandraServerHelper.startEmbeddedCassandra(); Cluster cluster = Cluster.builder() .addContactPoints("127.0.0.1").withPort(9142).build(); Session session = cluster.connect(); }

Seterusnya kita harus memastikan pelayan dihentikan setelah selesai pelaksanaan suite ujian:

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

6.3. Jadual Data Bersih

Adalah praktik yang baik untuk menjatuhkan dan membuat jadual data sebelum setiap pelaksanaan ujian, untuk mengelakkan hasil yang tidak dijangka kerana data yang dimanipulasi dalam pelaksanaan ujian sebelumnya.

Sekarang kita dapat membuat jadual data semasa pelayan dimulakan:

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

dan turun selepas setiap pelaksanaan kes ujian:

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

7. Akses Data Menggunakan CassandraRepository

Kami secara langsung dapat menggunakan BookRepository yang kami buat di atas untuk bertahan, memanipulasi dan mengambil data di pangkalan data Cassandra.

7.1. Simpan Buku Baru

Kami dapat menyimpan buku baru ke kedai buku kami:

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

Kemudian kita dapat memeriksa ketersediaan buku yang dimasukkan dalam pangkalan data:

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

7.2. Kemas kini Buku Sedia Ada

Permulaan Lat dengan memasukkan buku baru:

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

Mari ambil buku dengan tajuk:

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

Kemudian mari kita menukar tajuk buku:

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

Akhirnya mari kita periksa sama ada tajuknya dikemas kini dalam pangkalan data:

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

7.3. Padamkan Buku Sedia Ada

Masukkan buku baru:

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

Kemudian padamkan buku yang baru dimasukkan:

bookRepository.delete(javaBook); 

Sekarang kita dapat memeriksa penghapusan:

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

Ini akan menyebabkan pengecualian NoSuchElementException dari kod memastikan buku dihapuskan.

7.4. Cari Semua Buku

Masukkan buku baru terlebih dahulu:

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

Cari semua buku:

Iterable books = bookRepository.findAll();

Kemudian kita dapat memeriksa bilangan buku yang ada di pangkalan data:

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

8. Kesimpulannya

Kami melalui pengenalan langsung mengenai data Cassandra dengan Spring menggunakan pendekatan yang paling biasa menggunakan mekanisme akses data CassandraRepository .

Pelaksanaan coretan dan contoh kod di atas boleh didapati di projek GitHub saya - ini adalah projek berasaskan Eclipse, jadi mudah untuk diimport dan dijalankan sebagaimana adanya.