diff --git a/flyway-migration/.gitignore b/flyway-migration/.gitignore
new file mode 100644
index 0000000000..abffe04ed2
--- /dev/null
+++ b/flyway-migration/.gitignore
@@ -0,0 +1,4 @@
+.classpath
+.project
+.settings
+target/
\ No newline at end of file
diff --git a/flyway-migration/db/migration/V1_0__create_employee_schema.sql b/flyway-migration/db/migration/V1_0__create_employee_schema.sql
new file mode 100644
index 0000000000..09408faecb
--- /dev/null
+++ b/flyway-migration/db/migration/V1_0__create_employee_schema.sql
@@ -0,0 +1,8 @@
+CREATE TABLE IF NOT EXISTS `employee` (
+
+`id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
+`name` varchar(20),
+`email` varchar(50),
+`date_of_birth` timestamp
+
+)ENGINE=InnoDB DEFAULT CHARSET=UTF8;
\ No newline at end of file
diff --git a/flyway-migration/myFlywayConfig.properties b/flyway-migration/myFlywayConfig.properties
new file mode 100644
index 0000000000..22f3afefd3
--- /dev/null
+++ b/flyway-migration/myFlywayConfig.properties
@@ -0,0 +1,5 @@
+flyway.user=root
+flyway.password=mysql
+flyway.schemas=app-db
+flyway.url=jdbc:mysql://localhost:3306/
+flyway.locations=filesystem:db/migration
\ No newline at end of file
diff --git a/flyway-migration/pom.xml b/flyway-migration/pom.xml
new file mode 100644
index 0000000000..e3e29cd43f
--- /dev/null
+++ b/flyway-migration/pom.xml
@@ -0,0 +1,33 @@
+
+ 4.0.0
+ com.baeldung
+ flyway-migration
+ 1.0
+ flyway-migration
+ A sample project to demonstrate Flyway migrations
+
+
+ mysql
+ mysql-connector-java
+ 6.0.3
+
+
+
+
+
+ org.flywaydb
+ flyway-maven-plugin
+ 4.0.3
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 1.8
+ 1.8
+
+
+
+
+
\ No newline at end of file
diff --git a/java-cassandra/pom.xml b/java-cassandra/pom.xml
new file mode 100644
index 0000000000..265a230eb4
--- /dev/null
+++ b/java-cassandra/pom.xml
@@ -0,0 +1,102 @@
+
+ 4.0.0
+ com.baeldung
+ cassandra-java-client
+ 1.0.0-SNAPSHOT
+
+ cassandra-java-client
+
+
+ UTF-8
+
+
+ 1.7.21
+ 1.1.7
+
+
+ 1.3
+ 4.12
+ 1.10.19
+ 6.8
+ 3.5.1
+
+
+ 3.5.1
+
+
+ 3.1.0
+
+
+
+
+
+ com.datastax.cassandra
+ cassandra-driver-core
+ ${cassandra-driver-core.version}
+ true
+
+
+
+
+ org.cassandraunit
+ cassandra-unit
+ 3.0.0.1
+
+
+
+
+ com.google.guava
+ guava
+ 19.0
+
+
+
+
+
+ org.slf4j
+ slf4j-api
+ ${org.slf4j.version}
+
+
+ ch.qos.logback
+ logback-classic
+ ${logback.version}
+
+
+
+ org.slf4j
+ jcl-over-slf4j
+ ${org.slf4j.version}
+
+
+
+ org.slf4j
+ log4j-over-slf4j
+ ${org.slf4j.version}
+
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+
+
+ java-cassandra
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ 1.8
+ 1.8
+
+
+
+
+
+
diff --git a/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/CassandraClient.java b/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/CassandraClient.java
new file mode 100644
index 0000000000..c67a2c2ddb
--- /dev/null
+++ b/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/CassandraClient.java
@@ -0,0 +1,44 @@
+package com.baeldung.cassandra.java.client;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.baeldung.cassandra.java.client.domain.Book;
+import com.baeldung.cassandra.java.client.repository.BookRepository;
+import com.baeldung.cassandra.java.client.repository.KeyspaceRepository;
+import com.datastax.driver.core.Session;
+import com.datastax.driver.core.utils.UUIDs;
+
+public class CassandraClient {
+ private static final Logger LOG = LoggerFactory.getLogger(CassandraClient.class);
+
+ public static void main(String args[]) {
+ CassandraConnector connector = new CassandraConnector();
+ connector.connect("127.0.0.1", null);
+ Session session = connector.getSession();
+
+ KeyspaceRepository sr = new KeyspaceRepository(session);
+ sr.createKeyspace("library", "SimpleStrategy", 1);
+ sr.useKeyspace("library");
+
+ BookRepository br = new BookRepository(session);
+ br.createTable();
+ br.alterTablebooks("publisher", "text");
+
+ br.createTableBooksByTitle();
+
+ Book book = new Book(UUIDs.timeBased(), "Effective Java", "Joshua Bloch", "Programming");
+ br.insertBookBatch(book);
+
+ br.selectAll().forEach(o -> LOG.info("Title in books: " + o.getTitle()));
+ br.selectAllBookByTitle().forEach(o -> LOG.info("Title in booksByTitle: " + o.getTitle()));
+
+ br.deletebookByTitle("Effective Java");
+ br.deleteTable("books");
+ br.deleteTable("booksByTitle");
+
+ sr.deleteKeyspace("library");
+
+ connector.close();
+ }
+}
diff --git a/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/CassandraConnector.java b/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/CassandraConnector.java
new file mode 100644
index 0000000000..e035335ca0
--- /dev/null
+++ b/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/CassandraConnector.java
@@ -0,0 +1,51 @@
+package com.baeldung.cassandra.java.client;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.datastax.driver.core.Cluster;
+import com.datastax.driver.core.Cluster.Builder;
+import com.datastax.driver.core.Host;
+import com.datastax.driver.core.Metadata;
+import com.datastax.driver.core.Session;
+
+/**
+ *
+ * This is an implementation of a simple Java client.
+ *
+ */
+public class CassandraConnector {
+ private static final Logger LOG = LoggerFactory.getLogger(CassandraConnector.class);
+
+ private Cluster cluster;
+
+ private Session session;
+
+ public void connect(final String node, final Integer port) {
+
+ Builder b = Cluster.builder().addContactPoint(node);
+
+ if (port != null) {
+ b.withPort(port);
+ }
+ cluster = b.build();
+
+ Metadata metadata = cluster.getMetadata();
+ LOG.info("Cluster name: " + metadata.getClusterName());
+
+ for (Host host : metadata.getAllHosts()) {
+ LOG.info("Datacenter: " + host.getDatacenter() + " Host: " + host.getAddress() + " Rack: " + host.getRack());
+ }
+
+ session = cluster.connect();
+ }
+
+ public Session getSession() {
+ return this.session;
+ }
+
+ public void close() {
+ session.close();
+ cluster.close();
+ }
+}
diff --git a/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/domain/Book.java b/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/domain/Book.java
new file mode 100644
index 0000000000..e6c7753eb3
--- /dev/null
+++ b/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/domain/Book.java
@@ -0,0 +1,66 @@
+package com.baeldung.cassandra.java.client.domain;
+
+import java.util.UUID;
+
+public class Book {
+
+ private UUID id;
+
+ private String title;
+
+ private String author;
+
+ private String subject;
+
+ private String publisher;
+
+ Book() {
+ }
+
+ public Book(UUID id, String title, String author, String subject) {
+ this.id = id;
+ this.title = title;
+ this.author = author;
+ this.subject = subject;
+ }
+
+ public UUID getId() {
+ return id;
+ }
+
+ public void setId(UUID id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+ public String getSubject() {
+ return subject;
+ }
+
+ public void setSubject(String subject) {
+ this.subject = subject;
+ }
+
+ public String getPublisher() {
+ return publisher;
+ }
+
+ public void setPublisher(String publisher) {
+ this.publisher = publisher;
+ }
+}
diff --git a/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/repository/BookRepository.java b/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/repository/BookRepository.java
new file mode 100644
index 0000000000..31e2969e01
--- /dev/null
+++ b/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/repository/BookRepository.java
@@ -0,0 +1,177 @@
+package com.baeldung.cassandra.java.client.repository;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.baeldung.cassandra.java.client.domain.Book;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import com.datastax.driver.core.Session;
+
+public class BookRepository {
+
+ private static final String TABLE_NAME = "books";
+
+ private static final String TABLE_NAME_BY_TITLE = TABLE_NAME + "ByTitle";
+
+ private Session session;
+
+ public BookRepository(Session session) {
+ this.session = session;
+ }
+
+ /**
+ * Creates the books table.
+ */
+ public void createTable() {
+ StringBuilder sb = new StringBuilder("CREATE TABLE IF NOT EXISTS ").append(TABLE_NAME).append("(").append("id uuid PRIMARY KEY, ").append("title text,").append("author text,").append("subject text);");
+
+ final String query = sb.toString();
+ session.execute(query);
+ }
+
+ /**
+ * Creates the books table.
+ */
+ public void createTableBooksByTitle() {
+ StringBuilder sb = new StringBuilder("CREATE TABLE IF NOT EXISTS ").append(TABLE_NAME_BY_TITLE).append("(").append("id uuid, ").append("title text,").append("PRIMARY KEY (title, id));");
+
+ final String query = sb.toString();
+ session.execute(query);
+ }
+
+ /**
+ * Alters the table books and adds an extra column.
+ */
+ public void alterTablebooks(String columnName, String columnType) {
+ StringBuilder sb = new StringBuilder("ALTER TABLE ").append(TABLE_NAME).append(" ADD ").append(columnName).append(" ").append(columnType).append(";");
+
+ final String query = sb.toString();
+ session.execute(query);
+ }
+
+ /**
+ * Insert a row in the table books.
+ *
+ * @param book
+ */
+ public void insertbook(Book book) {
+ StringBuilder sb = new StringBuilder("INSERT INTO ").append(TABLE_NAME).append("(id, title, author, subject) ").append("VALUES (").append(book.getId()).append(", '").append(book.getTitle()).append("', '").append(book.getAuthor()).append("', '")
+ .append(book.getSubject()).append("');");
+
+ final String query = sb.toString();
+ session.execute(query);
+ }
+
+ /**
+ * Insert a row in the table booksByTitle.
+ * @param book
+ */
+ public void insertbookByTitle(Book book) {
+ StringBuilder sb = new StringBuilder("INSERT INTO ").append(TABLE_NAME_BY_TITLE).append("(id, title) ").append("VALUES (").append(book.getId()).append(", '").append(book.getTitle()).append("');");
+
+ final String query = sb.toString();
+ session.execute(query);
+ }
+
+ /**
+ * Insert a book into two identical tables using a batch query.
+ *
+ * @param book
+ */
+ public void insertBookBatch(Book book) {
+ StringBuilder sb = new StringBuilder("BEGIN BATCH ")
+ .append("INSERT INTO ").append(TABLE_NAME).append("(id, title, author, subject) ")
+ .append("VALUES (").append(book.getId()).append(", '").append(book.getTitle()).append("', '").append(book.getAuthor()).append("', '")
+ .append(book.getSubject()).append("');")
+ .append("INSERT INTO ").append(TABLE_NAME_BY_TITLE).append("(id, title) ")
+ .append("VALUES (").append(book.getId()).append(", '").append(book.getTitle()).append("');")
+ .append("APPLY BATCH;");
+
+ final String query = sb.toString();
+ session.execute(query);
+ }
+
+ /**
+ * Select book by id.
+ *
+ * @return
+ */
+ public Book selectByTitle(String title) {
+ StringBuilder sb = new StringBuilder("SELECT * FROM ").append(TABLE_NAME_BY_TITLE).append(" WHERE title = '").append(title).append("';");
+
+ final String query = sb.toString();
+
+ ResultSet rs = session.execute(query);
+
+ List books = new ArrayList();
+
+ for (Row r : rs) {
+ Book s = new Book(r.getUUID("id"), r.getString("title"), null, null);
+ books.add(s);
+ }
+
+ return books.get(0);
+ }
+
+ /**
+ * Select all books from books
+ *
+ * @return
+ */
+ public List selectAll() {
+ StringBuilder sb = new StringBuilder("SELECT * FROM ").append(TABLE_NAME);
+
+ final String query = sb.toString();
+ ResultSet rs = session.execute(query);
+
+ List books = new ArrayList();
+
+ for (Row r : rs) {
+ Book book = new Book(r.getUUID("id"), r.getString("title"), r.getString("author"), r.getString("subject"));
+ books.add(book);
+ }
+ return books;
+ }
+
+ /**
+ * Select all books from booksByTitle
+ * @return
+ */
+ public List selectAllBookByTitle() {
+ StringBuilder sb = new StringBuilder("SELECT * FROM ").append(TABLE_NAME_BY_TITLE);
+
+ final String query = sb.toString();
+ ResultSet rs = session.execute(query);
+
+ List books = new ArrayList();
+
+ for (Row r : rs) {
+ Book book = new Book(r.getUUID("id"), r.getString("title"), null, null);
+ books.add(book);
+ }
+ return books;
+ }
+
+ /**
+ * Delete a book by title.
+ */
+ public void deletebookByTitle(String title) {
+ StringBuilder sb = new StringBuilder("DELETE FROM ").append(TABLE_NAME_BY_TITLE).append(" WHERE title = '").append(title).append("';");
+
+ final String query = sb.toString();
+ session.execute(query);
+ }
+
+ /**
+ * Delete table.
+ *
+ * @param tableName the name of the table to delete.
+ */
+ public void deleteTable(String tableName) {
+ StringBuilder sb = new StringBuilder("DROP TABLE IF EXISTS ").append(tableName);
+
+ final String query = sb.toString();
+ session.execute(query);
+ }
+}
diff --git a/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/repository/KeyspaceRepository.java b/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/repository/KeyspaceRepository.java
new file mode 100644
index 0000000000..f15558f040
--- /dev/null
+++ b/java-cassandra/src/main/java/com/baeldung/cassandra/java/client/repository/KeyspaceRepository.java
@@ -0,0 +1,49 @@
+package com.baeldung.cassandra.java.client.repository;
+
+import com.datastax.driver.core.Session;
+
+/**
+ * Repository to handle the Cassandra schema.
+ *
+ */
+public class KeyspaceRepository {
+ private Session session;
+
+ public KeyspaceRepository(Session session) {
+ this.session = session;
+ }
+
+ /**
+ * Method used to create any keyspace - schema.
+ *
+ * @param schemaName the name of the schema.
+ * @param replicatioonStrategy the replication strategy.
+ * @param numberOfReplicas the number of replicas.
+ *
+ */
+ public void createKeyspace(String keyspaceName, String replicatioonStrategy, int numberOfReplicas) {
+ StringBuilder sb = new StringBuilder("CREATE KEYSPACE IF NOT EXISTS ").append(keyspaceName).append(" WITH replication = {").append("'class':'").append(replicatioonStrategy).append("','replication_factor':").append(numberOfReplicas).append("};");
+
+ final String query = sb.toString();
+
+ session.execute(query);
+ }
+
+ public void useKeyspace(String keyspace) {
+ session.execute("USE " + keyspace);
+ }
+
+ /**
+ * Method used to delete the specified schema.
+ * It results in the immediate, irreversable removal of the keyspace, including all tables and data contained in the keyspace.
+ *
+ * @param schemaName the name of the keyspace to delete.
+ */
+ public void deleteKeyspace(String keyspaceName) {
+ StringBuilder sb = new StringBuilder("DROP KEYSPACE ").append(keyspaceName);
+
+ final String query = sb.toString();
+
+ session.execute(query);
+ }
+}
diff --git a/java-cassandra/src/test/java/com/baeldung/cassandra/java/client/repository/BookRepositoryIntegrationTest.java b/java-cassandra/src/test/java/com/baeldung/cassandra/java/client/repository/BookRepositoryIntegrationTest.java
new file mode 100644
index 0000000000..62eae94c7c
--- /dev/null
+++ b/java-cassandra/src/test/java/com/baeldung/cassandra/java/client/repository/BookRepositoryIntegrationTest.java
@@ -0,0 +1,174 @@
+package com.baeldung.cassandra.java.client.repository;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.thrift.transport.TTransportException;
+import org.cassandraunit.utils.EmbeddedCassandraServerHelper;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.baeldung.cassandra.java.client.CassandraConnector;
+import com.baeldung.cassandra.java.client.domain.Book;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Session;
+import com.datastax.driver.core.exceptions.InvalidQueryException;
+import com.datastax.driver.core.utils.UUIDs;
+
+public class BookRepositoryIntegrationTest {
+
+ private KeyspaceRepository schemaRepository;
+
+ private BookRepository bookRepository;
+
+ private Session session;
+
+ final String KEYSPACE_NAME = "testLibrary";
+ final String BOOKS = "books";
+ final String BOOKS_BY_TITLE = "booksByTitle";
+
+ @BeforeClass
+ public static void init() throws ConfigurationException, TTransportException, IOException, InterruptedException {
+ // Start an embedded Cassandra Server
+ EmbeddedCassandraServerHelper.startEmbeddedCassandra(20000L);
+ }
+
+ @Before
+ public void connect() {
+ CassandraConnector client = new CassandraConnector();
+ client.connect("127.0.0.1", 9142);
+ this.session = client.getSession();
+ schemaRepository = new KeyspaceRepository(session);
+ schemaRepository.createKeyspace(KEYSPACE_NAME, "SimpleStrategy", 1);
+ schemaRepository.useKeyspace(KEYSPACE_NAME);
+ bookRepository = new BookRepository(session);
+ }
+
+ @Test
+ public void whenCreatingATable_thenCreatedCorrectly() {
+ bookRepository.deleteTable(BOOKS);
+ bookRepository.createTable();
+
+ ResultSet result = session.execute("SELECT * FROM " + KEYSPACE_NAME + "." + BOOKS + ";");
+
+ // Collect all the column names in one list.
+ List columnNames = result.getColumnDefinitions().asList().stream().map(cl -> cl.getName()).collect(Collectors.toList());
+ assertEquals(columnNames.size(), 4);
+ assertTrue(columnNames.contains("id"));
+ assertTrue(columnNames.contains("title"));
+ assertTrue(columnNames.contains("author"));
+ assertTrue(columnNames.contains("subject"));
+ }
+
+ @Test
+ public void whenAlteringTable_thenAddedColumnExists() {
+ bookRepository.deleteTable(BOOKS);
+ bookRepository.createTable();
+
+ bookRepository.alterTablebooks("publisher", "text");
+
+ ResultSet result = session.execute("SELECT * FROM " + KEYSPACE_NAME + "." + BOOKS + ";");
+
+ boolean columnExists = result.getColumnDefinitions().asList().stream().anyMatch(cl -> cl.getName().equals("publisher"));
+ assertTrue(columnExists);
+ }
+
+ @Test
+ public void whenAddingANewBook_thenBookExists() {
+ bookRepository.deleteTable(BOOKS_BY_TITLE);
+ bookRepository.createTableBooksByTitle();
+
+ String title = "Effective Java";
+ String author = "Joshua Bloch";
+ Book book = new Book(UUIDs.timeBased(), title, author, "Programming");
+ bookRepository.insertbookByTitle(book);
+
+ Book savedBook = bookRepository.selectByTitle(title);
+ assertEquals(book.getTitle(), savedBook.getTitle());
+ }
+
+ @Test
+ public void whenAddingANewBookBatch_ThenBookAddedInAllTables() {
+ // Create table books
+ bookRepository.deleteTable(BOOKS);
+ bookRepository.createTable();
+
+ // Create table booksByTitle
+ bookRepository.deleteTable(BOOKS_BY_TITLE);
+ bookRepository.createTableBooksByTitle();
+
+ String title = "Effective Java";
+ String author = "Joshua Bloch";
+ Book book = new Book(UUIDs.timeBased(), title, author, "Programming");
+ bookRepository.insertBookBatch(book);
+
+ List books = bookRepository.selectAll();
+
+ assertEquals(1, books.size());
+ assertTrue(books.stream().anyMatch(b -> b.getTitle().equals("Effective Java")));
+
+ List booksByTitle = bookRepository.selectAllBookByTitle();
+
+ assertEquals(1, booksByTitle.size());
+ assertTrue(booksByTitle.stream().anyMatch(b -> b.getTitle().equals("Effective Java")));
+ }
+
+ @Test
+ public void whenSelectingAll_thenReturnAllRecords() {
+ bookRepository.deleteTable(BOOKS);
+ bookRepository.createTable();
+
+ Book book = new Book(UUIDs.timeBased(), "Effective Java", "Joshua Bloch", "Programming");
+ bookRepository.insertbook(book);
+
+ book = new Book(UUIDs.timeBased(), "Clean Code", "Robert C. Martin", "Programming");
+ bookRepository.insertbook(book);
+
+ List books = bookRepository.selectAll();
+
+ assertEquals(2, books.size());
+ assertTrue(books.stream().anyMatch(b -> b.getTitle().equals("Effective Java")));
+ assertTrue(books.stream().anyMatch(b -> b.getTitle().equals("Clean Code")));
+ }
+
+ @Test
+ public void whenDeletingABookByTitle_thenBookIsDeleted() {
+ bookRepository.deleteTable(BOOKS_BY_TITLE);
+ bookRepository.createTableBooksByTitle();
+
+ Book book = new Book(UUIDs.timeBased(), "Effective Java", "Joshua Bloch", "Programming");
+ bookRepository.insertbookByTitle(book);
+
+ book = new Book(UUIDs.timeBased(), "Clean Code", "Robert C. Martin", "Programming");
+ bookRepository.insertbookByTitle(book);
+
+ bookRepository.deletebookByTitle("Clean Code");
+
+ List books = bookRepository.selectAllBookByTitle();
+ assertEquals(1, books.size());
+ assertTrue(books.stream().anyMatch(b -> b.getTitle().equals("Effective Java")));
+ assertFalse(books.stream().anyMatch(b -> b.getTitle().equals("Clean Code")));
+
+ }
+
+ @Test(expected = InvalidQueryException.class)
+ public void whenDeletingATable_thenUnconfiguredTable() {
+ bookRepository.createTable();
+ bookRepository.deleteTable(BOOKS);
+
+ session.execute("SELECT * FROM " + KEYSPACE_NAME + "." + BOOKS + ";");
+ }
+
+ @AfterClass
+ public static void cleanup() {
+ EmbeddedCassandraServerHelper.cleanEmbeddedCassandra();
+ }
+}
diff --git a/java-cassandra/src/test/java/com/baeldung/cassandra/java/client/repository/KeyspaceRepositoryIntegrationTest.java b/java-cassandra/src/test/java/com/baeldung/cassandra/java/client/repository/KeyspaceRepositoryIntegrationTest.java
new file mode 100644
index 0000000000..9df46b3176
--- /dev/null
+++ b/java-cassandra/src/test/java/com/baeldung/cassandra/java/client/repository/KeyspaceRepositoryIntegrationTest.java
@@ -0,0 +1,77 @@
+package com.baeldung.cassandra.java.client.repository;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.thrift.transport.TTransportException;
+import org.cassandraunit.utils.EmbeddedCassandraServerHelper;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+import com.baeldung.cassandra.java.client.CassandraConnector;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Session;
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class KeyspaceRepositoryIntegrationTest {
+
+ private KeyspaceRepository schemaRepository;
+
+ private Session session;
+
+ @BeforeClass
+ public static void init() throws ConfigurationException, TTransportException, IOException, InterruptedException {
+ // Start an embedded Cassandra Server
+ EmbeddedCassandraServerHelper.startEmbeddedCassandra(20000L);
+ }
+
+ @Before
+ public void connect() {
+ CassandraConnector client = new CassandraConnector();
+ client.connect("127.0.0.1", 9142);
+ this.session = client.getSession();
+ schemaRepository = new KeyspaceRepository(session);
+ }
+
+ @Test
+ public void whenCreatingAKeyspace_thenCreated() {
+ String keyspaceName = "testBaeldungKeyspace";
+ schemaRepository.createKeyspace(keyspaceName, "SimpleStrategy", 1);
+
+ // ResultSet result = session.execute("SELECT * FROM system_schema.keyspaces WHERE keyspace_name = 'testBaeldungKeyspace';");
+
+ ResultSet result = session.execute("SELECT * FROM system_schema.keyspaces;");
+
+ // Check if the Keyspace exists in the returned keyspaces.
+ List matchedKeyspaces = result.all().stream().filter(r -> r.getString(0).equals(keyspaceName.toLowerCase())).map(r -> r.getString(0)).collect(Collectors.toList());
+ assertEquals(matchedKeyspaces.size(), 1);
+ assertTrue(matchedKeyspaces.get(0).equals(keyspaceName.toLowerCase()));
+ }
+
+ @Test
+ public void whenDeletingAKeyspace_thenDoesNotExist() {
+ String keyspaceName = "testBaeldungKeyspace";
+
+ // schemaRepository.createKeyspace(keyspaceName, "SimpleStrategy", 1);
+ schemaRepository.deleteKeyspace(keyspaceName);
+
+ ResultSet result = session.execute("SELECT * FROM system_schema.keyspaces;");
+ boolean isKeyspaceCreated = result.all().stream().anyMatch(r -> r.getString(0).equals(keyspaceName.toLowerCase()));
+ assertFalse(isKeyspaceCreated);
+ }
+
+ @AfterClass
+ public static void cleanup() {
+ EmbeddedCassandraServerHelper.cleanEmbeddedCassandra();
+ }
+}
diff --git a/pom.xml b/pom.xml
index db3fa8a21c..2f588c032c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -129,7 +129,7 @@
redis
xstream
-
+ java-cassandra
diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/PossessionRepository.java b/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/PossessionRepository.java
new file mode 100644
index 0000000000..34913632d8
--- /dev/null
+++ b/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/PossessionRepository.java
@@ -0,0 +1,8 @@
+package org.baeldung.persistence.multiple.dao.user;
+
+import org.baeldung.persistence.multiple.model.user.Possession;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface PossessionRepository extends JpaRepository {
+
+}
diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/Possession.java b/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/Possession.java
new file mode 100644
index 0000000000..97b5803d73
--- /dev/null
+++ b/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/Possession.java
@@ -0,0 +1,86 @@
+package org.baeldung.persistence.multiple.model.user;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(schema = "spring_jpa_user")
+public class Possession {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private long id;
+
+ private String name;
+
+ public Possession() {
+ super();
+ }
+
+ public Possession(final String name) {
+ super();
+
+ this.name = name;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(final int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = (prime * result) + (int) (id ^ (id >>> 32));
+ result = (prime * result) + ((name == null) ? 0 : name.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ final Possession other = (Possession) obj;
+ if (id != other.id) {
+ return false;
+ }
+ if (name == null) {
+ if (other.name != null) {
+ return false;
+ }
+ } else if (!name.equals(other.name)) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder builder = new StringBuilder();
+ builder.append("Possesion [id=").append(id).append(", name=").append(name).append("]");
+ return builder.toString();
+ }
+
+}
diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java b/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java
index 305568bad8..1c6399dc44 100644
--- a/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java
+++ b/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java
@@ -1,10 +1,13 @@
package org.baeldung.persistence.multiple.model.user;
+import java.util.List;
+
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
+import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@@ -22,6 +25,9 @@ public class User {
private int age;
+ @OneToMany
+ List possessionList;
+
public User() {
super();
}
@@ -58,6 +64,14 @@ public class User {
this.age = age;
}
+ public List getPossessionList() {
+ return possessionList;
+ }
+
+ public void setPossessionList(List possessionList) {
+ this.possessionList = possessionList;
+ }
+
@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBIntegrationTest.java b/spring-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBIntegrationTest.java
index 7e6b2722fa..f20af34057 100644
--- a/spring-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBIntegrationTest.java
+++ b/spring-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBIntegrationTest.java
@@ -1,14 +1,18 @@
package org.baeldung.persistence.service;
import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import java.util.Arrays;
+
import org.baeldung.config.ProductConfig;
import org.baeldung.config.UserConfig;
import org.baeldung.persistence.multiple.dao.product.ProductRepository;
+import org.baeldung.persistence.multiple.dao.user.PossessionRepository;
import org.baeldung.persistence.multiple.dao.user.UserRepository;
import org.baeldung.persistence.multiple.model.product.Product;
+import org.baeldung.persistence.multiple.model.user.Possession;
import org.baeldung.persistence.multiple.model.user.User;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -16,15 +20,20 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.Transactional;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { UserConfig.class, ProductConfig.class })
+@EnableTransactionManagement
public class JpaMultipleDBIntegrationTest {
@Autowired
private UserRepository userRepository;
+ @Autowired
+ private PossessionRepository possessionRepository;
+
@Autowired
private ProductRepository productRepository;
@@ -37,9 +46,14 @@ public class JpaMultipleDBIntegrationTest {
user.setName("John");
user.setEmail("john@test.com");
user.setAge(20);
+ Possession p = new Possession("sample");
+ p = possessionRepository.save(p);
+ user.setPossessionList(Arrays.asList(p));
user = userRepository.save(user);
-
- assertNotNull(userRepository.findOne(user.getId()));
+ final User result = userRepository.findOne(user.getId());
+ assertNotNull(result);
+ System.out.println(result.getPossessionList());
+ assertTrue(result.getPossessionList().size() == 1);
}
@Test