diff --git a/flyway/pom.xml b/flyway/pom.xml
index 2774602654..5cb8fabe67 100644
--- a/flyway/pom.xml
+++ b/flyway/pom.xml
@@ -1,10 +1,10 @@
4.0.0
- com.baeldung
flyway
1.0
flyway
+ pom
A sample project to demonstrate Flyway migrations
@@ -13,6 +13,10 @@
1.0.0-SNAPSHOT
+
+ spring-flyway
+
+
mysql
@@ -20,6 +24,17 @@
${mysql.version}
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${spring.boot.version}
+ pom
+ import
+
+
+
@@ -32,5 +47,6 @@
6.0.5
4.0.3
+ 1.5.8.RELEASE
\ No newline at end of file
diff --git a/flyway/spring-flyway/.gitignore b/flyway/spring-flyway/.gitignore
new file mode 100644
index 0000000000..2af7cefb0a
--- /dev/null
+++ b/flyway/spring-flyway/.gitignore
@@ -0,0 +1,24 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+nbproject/private/
+build/
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
\ No newline at end of file
diff --git a/flyway/spring-flyway/pom.xml b/flyway/spring-flyway/pom.xml
new file mode 100644
index 0000000000..cf5703cfab
--- /dev/null
+++ b/flyway/spring-flyway/pom.xml
@@ -0,0 +1,57 @@
+
+
+ 4.0.0
+
+ spring-flyway
+ 0.0.1-SNAPSHOT
+ jar
+
+ spring-flyway
+ Spring Boot Test Flyway Migrations
+
+
+ flyway
+ com.baeldung
+ 1.0
+ ../../flyway
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ org.flywaydb
+ flyway-core
+
+
+ org.projectlombok
+ lombok
+
+
+ com.h2database
+ h2
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/SpringFlywayApplication.java b/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/SpringFlywayApplication.java
new file mode 100644
index 0000000000..9218fbc88d
--- /dev/null
+++ b/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/SpringFlywayApplication.java
@@ -0,0 +1,12 @@
+package com.baeldung.springflyway;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SpringFlywayApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SpringFlywayApplication.class, args);
+ }
+}
diff --git a/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/entities/Customer.java b/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/entities/Customer.java
new file mode 100644
index 0000000000..194b961d2d
--- /dev/null
+++ b/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/entities/Customer.java
@@ -0,0 +1,28 @@
+package com.baeldung.springflyway.entities;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+@Entity
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class Customer {
+
+ @Id
+ @GeneratedValue
+ private Long id;
+
+ private String firstName;
+ private String lastName;
+
+ private String email;
+
+}
diff --git a/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/migration/V2__uk_lastname_customer.java b/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/migration/V2__uk_lastname_customer.java
new file mode 100644
index 0000000000..52b851546b
--- /dev/null
+++ b/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/migration/V2__uk_lastname_customer.java
@@ -0,0 +1,14 @@
+package com.baeldung.springflyway.migration;
+
+import org.flywaydb.core.api.migration.spring.SpringJdbcMigration;
+import org.springframework.jdbc.core.JdbcTemplate;
+
+public class V2__uk_lastname_customer implements SpringJdbcMigration {
+
+ final String CUSTOMER_LASTNAME_UK = "ALTER TABLE customer ADD CONSTRAINT uk_customer_lastname UNIQUE(last_name);";
+
+ @Override
+ public void migrate(final JdbcTemplate jdbcTemplate) throws Exception {
+ jdbcTemplate.execute(CUSTOMER_LASTNAME_UK);
+ }
+}
diff --git a/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/repositories/CustomerRepository.java b/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/repositories/CustomerRepository.java
new file mode 100644
index 0000000000..0a1fb5a146
--- /dev/null
+++ b/flyway/spring-flyway/src/main/java/com/baeldung/springflyway/repositories/CustomerRepository.java
@@ -0,0 +1,11 @@
+package com.baeldung.springflyway.repositories;
+
+import com.baeldung.springflyway.entities.Customer;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.Optional;
+
+public interface CustomerRepository extends JpaRepository {
+
+ Optional findByEmail(String email);
+}
diff --git a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInitialMigrationTest.java b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInitialMigrationTest.java
new file mode 100644
index 0000000000..b3f2cb29e1
--- /dev/null
+++ b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInitialMigrationTest.java
@@ -0,0 +1,28 @@
+package com.baeldung.springflyway;
+
+import com.baeldung.springflyway.entities.Customer;
+import com.baeldung.springflyway.repositories.CustomerRepository;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.junit.Assert.assertNotNull;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class CustomerRepositoryInitialMigrationTest {
+
+ @Autowired CustomerRepository customerRepository;
+
+ @Test
+ public void givenSchemaCreationMigration_whenTryingToCreateACustomer_thenSuccess() {
+ Customer customer = customerRepository.save(Customer
+ .builder()
+ .email("customer@email.com")
+ .build());
+ assertNotNull(customer.getId());
+ }
+
+}
diff --git a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInsertDataMigrationTest.java b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInsertDataMigrationTest.java
new file mode 100644
index 0000000000..369e61d98f
--- /dev/null
+++ b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryInsertDataMigrationTest.java
@@ -0,0 +1,35 @@
+package com.baeldung.springflyway;
+
+import com.baeldung.springflyway.entities.Customer;
+import com.baeldung.springflyway.repositories.CustomerRepository;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.List;
+import java.util.Optional;
+
+import static org.junit.Assert.*;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class CustomerRepositoryInsertDataMigrationTest {
+
+ @Autowired CustomerRepository customerRepository;
+
+ @Test
+ public void givenASetInsertData_whenRunningMigrationsWithSuccess_thenASpecificCustomerIsFound() {
+ Optional customerOptional = customerRepository.findByEmail("email@email.com");
+ assertTrue(customerOptional.isPresent());
+ }
+
+ @Test
+ public void givenASetInsertData_whenRunningMigrationsWithSuccess_thenASetOfCustomersIsFound() {
+ List customers = customerRepository.findAll();
+ assertNotNull(customers);
+ assertEquals(customers.size(), 6);
+ }
+
+}
diff --git a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryNotNullConstraintMigrationTest.java b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryNotNullConstraintMigrationTest.java
new file mode 100644
index 0000000000..90517c9225
--- /dev/null
+++ b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryNotNullConstraintMigrationTest.java
@@ -0,0 +1,25 @@
+package com.baeldung.springflyway;
+
+import com.baeldung.springflyway.entities.Customer;
+import com.baeldung.springflyway.repositories.CustomerRepository;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.dao.DataIntegrityViolationException;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class CustomerRepositoryNotNullConstraintMigrationTest {
+
+ @Autowired CustomerRepository customerRepository;
+
+ @Test(expected = DataIntegrityViolationException.class)
+ public void givenTheNotNullConstraintMigrations_whenInsertingACustomerWithNullEmail_thenThrowException() {
+ customerRepository.save(Customer
+ .builder()
+ .build());
+ }
+
+}
diff --git a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintJavaMigrationTest.java b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintJavaMigrationTest.java
new file mode 100644
index 0000000000..e5ba782fda
--- /dev/null
+++ b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintJavaMigrationTest.java
@@ -0,0 +1,29 @@
+package com.baeldung.springflyway;
+
+import com.baeldung.springflyway.entities.Customer;
+import com.baeldung.springflyway.repositories.CustomerRepository;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.dao.DataIntegrityViolationException;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(properties = {
+ "flyway.locations[0]=db/migration", "flyway.locations[1]=com/baeldung/springflyway/migration"
+})
+public class CustomerRepositoryUniqueConstraintJavaMigrationTest {
+
+ @Autowired CustomerRepository customerRepository;
+
+ @Test(expected = DataIntegrityViolationException.class)
+ public void givenTheUniqueConstraintMigrations_whenInsertingAnExistingLastNameCustomer_thenThrowException() {
+ customerRepository.save(Customer
+ .builder()
+ .lastName("LastName")
+ .build());
+
+ }
+
+}
diff --git a/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintMigrationTest.java b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintMigrationTest.java
new file mode 100644
index 0000000000..9fa2dee42d
--- /dev/null
+++ b/flyway/spring-flyway/src/test/java/com/baeldung/springflyway/CustomerRepositoryUniqueConstraintMigrationTest.java
@@ -0,0 +1,27 @@
+package com.baeldung.springflyway;
+
+import com.baeldung.springflyway.entities.Customer;
+import com.baeldung.springflyway.repositories.CustomerRepository;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.dao.DataIntegrityViolationException;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class CustomerRepositoryUniqueConstraintMigrationTest {
+
+ @Autowired CustomerRepository customerRepository;
+
+ @Test(expected = DataIntegrityViolationException.class)
+ public void givenTheUniqueConstraintMigrations_whenInsertingAnExistingEmailCustomer_thenThrowException() {
+ customerRepository.save(Customer
+ .builder()
+ .email("email@email.com")
+ .build());
+
+ }
+
+}
diff --git a/flyway/spring-flyway/src/test/resources/application.properties b/flyway/spring-flyway/src/test/resources/application.properties
new file mode 100644
index 0000000000..5656ca79ce
--- /dev/null
+++ b/flyway/spring-flyway/src/test/resources/application.properties
@@ -0,0 +1 @@
+spring.jpa.hibernate.ddl-auto=validate
\ No newline at end of file
diff --git a/flyway/spring-flyway/src/test/resources/db/migration/V1_0__create_table_customer.sql b/flyway/spring-flyway/src/test/resources/db/migration/V1_0__create_table_customer.sql
new file mode 100644
index 0000000000..8c65253ed8
--- /dev/null
+++ b/flyway/spring-flyway/src/test/resources/db/migration/V1_0__create_table_customer.sql
@@ -0,0 +1,6 @@
+create table if not exists customer (
+ id bigint AUTO_INCREMENT not null primary key,
+ first_name varchar(255) ,
+ last_name varchar(255) ,
+ email varchar(255)
+);
\ No newline at end of file
diff --git a/flyway/spring-flyway/src/test/resources/db/migration/V1_1__insert_customer.sql b/flyway/spring-flyway/src/test/resources/db/migration/V1_1__insert_customer.sql
new file mode 100644
index 0000000000..6bba6e00a1
--- /dev/null
+++ b/flyway/spring-flyway/src/test/resources/db/migration/V1_1__insert_customer.sql
@@ -0,0 +1,6 @@
+insert into customer (first_name, last_name, email) values ('FirstName', 'LastName', 'email@email.com');
+insert into customer (first_name, last_name, email) values ('FirstName1', 'LastName1', 'email1@email.com');
+insert into customer (first_name, last_name, email) values ('FirstName2', 'LastName2', 'email2@email.com');
+insert into customer (first_name, last_name, email) values ('FirstName3', 'LastName3', 'email3@email.com');
+insert into customer (first_name, last_name, email) values ('FirstName4', 'LastName4', 'email4@email.com');
+insert into customer (first_name, last_name, email) values ('FirstName5', 'LastName5', 'email5@email.com');
\ No newline at end of file
diff --git a/flyway/spring-flyway/src/test/resources/db/migration/V1_2__make_email_not_null.sql b/flyway/spring-flyway/src/test/resources/db/migration/V1_2__make_email_not_null.sql
new file mode 100644
index 0000000000..b1cc396741
--- /dev/null
+++ b/flyway/spring-flyway/src/test/resources/db/migration/V1_2__make_email_not_null.sql
@@ -0,0 +1 @@
+ALTER TABLE customer ALTER email SET NOT NULL;
\ No newline at end of file
diff --git a/flyway/spring-flyway/src/test/resources/db/migration/V1_3__make_email_unique.sql b/flyway/spring-flyway/src/test/resources/db/migration/V1_3__make_email_unique.sql
new file mode 100644
index 0000000000..19d738fe46
--- /dev/null
+++ b/flyway/spring-flyway/src/test/resources/db/migration/V1_3__make_email_unique.sql
@@ -0,0 +1 @@
+ALTER TABLE customer ADD CONSTRAINT uk_customer_email UNIQUE(email);
\ No newline at end of file