Pengantar Spring Data Cassandra

1. Ikhtisar

Artikel ini adalah pengantar praktis untuk bekerja dengan Cassandra dengan Spring Data.

Kami akan mulai dari dasar dan melalui konfigurasi dan pengkodean, akhirnya membangun modul Spring Data Cassandra lengkap.

2. Ketergantungan Maven

Mari kita mulai dengan mendefinisikan dependensi di pom.xml , dengan Maven:

 com.datastax.cassandra cassandra-driver-core 2.1.9 

3. Konfigurasi untuk Cassandra

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

3.1. Konfigurasi Utama

Mari kita mulai dengan kelas konfigurasi utama - tentu saja didorong melalui anotasi @Configuration level kelas :

@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 implementasi default. Ini diperlukan untuk memetakan entitas persisten antara objek mereka dan format persistennya.

Dan karena implementasi default cukup mampu, kita dapat menggunakannya secara langsung.

3.2. Properti Koneksi Cassandra

Ada tiga pengaturan wajib yang harus kita konfigurasikan untuk menyiapkan koneksi untuk klien Cassandra.

Kita harus mengatur nama host yang dijalankan oleh server Cassandra sebagai c ontactPoints. Port hanyalah port mendengarkan untuk permintaan di server. KeyspaceName adalah namespace yang mendefinisikan replikasi data pada node, yang didasarkan pada konsep terkait Cassandra.

4. Tempat Penyimpanan Cassandra

Kami akan menggunakan CassandraRepository untuk lapisan akses data. Ini mengikuti abstraksi repositori Spring Data, yang difokuskan pada mengabstraksi kode yang diperlukan untuk mengimplementasikan lapisan akses data di seluruh mekanisme persistensi yang berbeda.

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 Bagian 3.1, menambahkan anotasi tingkat kelas @EnableCassandraRepositories untuk menandai Repositori Cassandra yang dibuat di bagian 4.1 di CassandraConfig:

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

5. Entitas

Mari kita lihat sekilas entitas - kelas model yang akan kita gunakan. Kelas diberi anotasi dan menentukan parameter tambahan untuk metadata pembuatan tabel data Cassandra dalam mode tersemat.

Menggunakan anotasi @Table , kacang secara langsung dipetakan ke tabel data Cassandra. Juga setiap properti didefinisikan sebagai jenis kunci utama atau kolom 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 Server Tertanam

6.1. Dependensi Maven

Jika Anda ingin menjalankan Cassandra dalam mode tertanam (tanpa menginstal server Cassandra terpisah secara manual), Anda perlu menambahkan dependensi terkait cassandra-unit 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 

Dimungkinkan untuk menggunakan server Cassandra tertanam untuk menguji aplikasi ini . Keuntungan utamanya adalah Anda tidak ingin menginstal Cassandra secara eksplisit.

Server tertanam ini juga kompatibel dengan Spring JUnit Tests. Di sini kita dapat menyetel SpringJUnit4ClassRunner menggunakan anotasi @RunWith bersama dengan server tertanam. Jadi dimungkinkan untuk mengimplementasikan rangkaian pengujian lengkap tanpa menjalankan layanan Cassandra eksternal.

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

6.2. Memulai dan Menghentikan Server

Anda dapat mengabaikan bagian ini jika Anda menjalankan server Cassandra eksternal.

Kita harus memulai server sekali untuk keseluruhan rangkaian pengujian, jadi metode mulai server 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(); }

Selanjutnya kita harus memastikan server dihentikan setelah penyelesaian rangkaian pengujian:

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

6.3. Tabel Data Bersih

Merupakan praktik yang baik untuk melepaskan dan membuat tabel data sebelum setiap eksekusi uji, untuk menghindari hasil yang tidak diharapkan karena data yang dimanipulasi dalam eksekusi uji sebelumnya.

Sekarang kita dapat membuat tabel data saat server dimulai:

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

dan berhenti setelah setiap eksekusi kasus uji:

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

7. Akses Data Menggunakan CassandraRepository

Kita bisa langsung menggunakan BookRepository yang kita buat di atas untuk mempertahankan , memanipulasi, dan mengambil data di basis data Cassandra.

7.1. Simpan Buku Baru

Kami dapat menyimpan buku baru ke toko buku kami:

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

Kemudian kami dapat memeriksa ketersediaan buku yang dimasukkan di database:

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

7.2. Perbarui Buku yang Ada

Lat mulai 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 kita ambil buku dengan judulnya:

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

Kalau begitu mari kita ubah judul bukunya:

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

Akhirnya mari kita periksa apakah judul diperbarui dalam database:

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

7.3. Hapus Buku yang Ada

Sisipkan buku baru:

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

Kemudian hapus buku yang baru masuk:

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 pelemparan NoSuchElementException dari kode yang memastikan buku dihapus.

7.4. Temukan Semua Buku

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

Temukan semua buku:

Iterable books = bookRepository.findAll();

Kemudian kami dapat memeriksa jumlah buku yang tersedia di database:

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

8. Kesimpulan

Kami melalui pengantar langsung dasar ke data Cassandra dengan Spring menggunakan pendekatan yang paling umum menggunakan mekanisme akses data CassandraRepository .

Penerapan cuplikan kode dan contoh di atas dapat ditemukan di proyek GitHub saya - ini adalah proyek berbasis Eclipse, jadi semestinya mudah untuk mengimpor dan menjalankan apa adanya.