From 9f00b4abe0dee81196881b16293b90f9e177c72e Mon Sep 17 00:00:00 2001 From: sverma1-godaddy Date: Sun, 3 Aug 2025 22:42:32 +0530 Subject: [PATCH 1/6] BAEL-6525: changes for Set up Multiple Database with Flyway in Spring Boot --- .../flyway-multidb-springboot/pom.xml | 58 ++++++++++++++++ .../baeldung/FlywayMultidbApplication.java | 13 ++++ .../com/baeldung/config/ProductDbConfig.java | 64 +++++++++++++++++ .../com/baeldung/config/UserDbConfig.java | 69 +++++++++++++++++++ .../java/com/baeldung/entity/Product.java | 29 ++++++++ .../main/java/com/baeldung/entity/User.java | 31 +++++++++ .../repository/product/ProductRepository.java | 7 ++ .../repository/user/UserRepository.java | 7 ++ .../com/baeldung/service/ProductService.java | 27 ++++++++ .../com/baeldung/service/UserService.java | 25 +++++++ .../src/main/resources/application.yml | 27 ++++++++ .../productdb/V1__create_products_table.sql | 4 ++ .../userdb/V1__create_users_table.sql | 4 ++ .../FlywayMultidbApplicationTests.java | 13 ++++ .../baeldung/service/MultiDbServiceTest.java | 47 +++++++++++++ spring-boot-modules/pom.xml | 1 + 16 files changed, 426 insertions(+) create mode 100644 spring-boot-modules/flyway-multidb-springboot/pom.xml create mode 100644 spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/FlywayMultidbApplication.java create mode 100644 spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/ProductDbConfig.java create mode 100644 spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/UserDbConfig.java create mode 100644 spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/entity/Product.java create mode 100644 spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/entity/User.java create mode 100644 spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/repository/product/ProductRepository.java create mode 100644 spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/repository/user/UserRepository.java create mode 100644 spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/service/ProductService.java create mode 100644 spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/service/UserService.java create mode 100644 spring-boot-modules/flyway-multidb-springboot/src/main/resources/application.yml create mode 100644 spring-boot-modules/flyway-multidb-springboot/src/main/resources/db.migration/productdb/V1__create_products_table.sql create mode 100644 spring-boot-modules/flyway-multidb-springboot/src/main/resources/db.migration/userdb/V1__create_users_table.sql create mode 100644 spring-boot-modules/flyway-multidb-springboot/src/test/java/com/baeldung/flyway_multidb/FlywayMultidbApplicationTests.java create mode 100644 spring-boot-modules/flyway-multidb-springboot/src/test/java/com/baeldung/service/MultiDbServiceTest.java diff --git a/spring-boot-modules/flyway-multidb-springboot/pom.xml b/spring-boot-modules/flyway-multidb-springboot/pom.xml new file mode 100644 index 000000000000..17e44773efd1 --- /dev/null +++ b/spring-boot-modules/flyway-multidb-springboot/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + flyway-multidb-springboot + 0.0.1-SNAPSHOT + flyway-multidb-springboot + This is simple boot application for Spring boot multiple flyway database + + + com.baeldung.spring-boot-modules + spring-boot-modules + 1.0.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + org.flywaydb + flyway-core + + + + com.h2database + h2 + runtime + + + org.springframework.boot + spring-boot-starter-test + test + + + org.testng + testng + RELEASE + compile + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + \ No newline at end of file diff --git a/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/FlywayMultidbApplication.java b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/FlywayMultidbApplication.java new file mode 100644 index 000000000000..cd411268b4d4 --- /dev/null +++ b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/FlywayMultidbApplication.java @@ -0,0 +1,13 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication(scanBasePackages = "com.baeldung") +public class FlywayMultidbApplication { + + public static void main(String[] args) { + SpringApplication.run(FlywayMultidbApplication.class, args); + } + +} diff --git a/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/ProductDbConfig.java b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/ProductDbConfig.java new file mode 100644 index 000000000000..bc3815a194a6 --- /dev/null +++ b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/ProductDbConfig.java @@ -0,0 +1,64 @@ +package com.baeldung.config; + +import jakarta.annotation.PostConstruct; +import javax.sql.DataSource; +import java.util.Map; +import jakarta.persistence.EntityManagerFactory; +import org.flywaydb.core.Flyway; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; +import org.springframework.context.annotation.*; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.orm.jpa.*; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@Configuration +@EnableTransactionManagement +@EnableJpaRepositories( + basePackages = "com.baeldung.repository.product", + entityManagerFactoryRef = "productEntityManagerFactory", + transactionManagerRef = "productTransactionManager" +) +public class ProductDbConfig { + + @Bean + public DataSource productDataSource() { + return DataSourceBuilder.create() + .url("jdbc:h2:mem:productdb") + .username("sa") + .password("") + .driverClassName("org.h2.Driver") + .build(); + } + + @Bean + public LocalContainerEntityManagerFactoryBean productEntityManagerFactory( + EntityManagerFactoryBuilder builder) { + + return builder + .dataSource(productDataSource()) + .packages("com.baeldung.entity") + .persistenceUnit("productPU") + .properties(Map.of("hibernate.hbm2ddl.auto", "create-drop")) + .build(); + } + + @Bean + public PlatformTransactionManager productTransactionManager( + EntityManagerFactory productEntityManagerFactory) { + + return new JpaTransactionManager(productEntityManagerFactory); + } + + @PostConstruct + public Flyway migrateProductDb() { + Flyway flyway = Flyway.configure() + .dataSource(productDataSource()) + .locations("classpath:db/migration/productdb") + .load(); + flyway.migrate(); + + return flyway; + } +} diff --git a/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/UserDbConfig.java b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/UserDbConfig.java new file mode 100644 index 000000000000..2ff435af85ce --- /dev/null +++ b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/UserDbConfig.java @@ -0,0 +1,69 @@ +package com.baeldung.config; + +import jakarta.annotation.PostConstruct; +import jakarta.persistence.EntityManagerFactory; +import org.flywaydb.core.Flyway; +import java.util.Map; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.sql.DataSource; + +@Configuration +@EnableTransactionManagement +@EnableJpaRepositories( + basePackages = "com.baeldung.repository.user", + entityManagerFactoryRef = "userEntityManagerFactory", + transactionManagerRef = "userTransactionManager" +) +public class UserDbConfig { + + @Bean + @Primary + public DataSource userDataSource() { + return DataSourceBuilder.create() + .url("jdbc:h2:mem:userdb") + .username("sa") + .password("") + .driverClassName("org.h2.Driver") + .build(); + } + + @Bean + @Primary + public LocalContainerEntityManagerFactoryBean userEntityManagerFactory( + EntityManagerFactoryBuilder builder) { + + return builder + .dataSource(userDataSource()) + .packages("com.baeldung.entity") + .persistenceUnit("userPU") + .properties(Map.of("hibernate.hbm2ddl.auto", "create-drop")) + .build(); + } + + @Bean + @Primary + public PlatformTransactionManager userTransactionManager( + EntityManagerFactory userEntityManagerFactory) { + + return new JpaTransactionManager(userEntityManagerFactory); + } + + @PostConstruct + public void migrateUserDb() { + Flyway.configure() + .dataSource(userDataSource()) + .locations("classpath:db/migration/userdb") + .load() + .migrate(); + } +} diff --git a/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/entity/Product.java b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/entity/Product.java new file mode 100644 index 000000000000..ad164780b21a --- /dev/null +++ b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/entity/Product.java @@ -0,0 +1,29 @@ +package com.baeldung.entity; + +import jakarta.persistence.*; + +@Entity +@Table(name = "products") +public class Product { + + @Id + private Long id; + + private String name; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/entity/User.java b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/entity/User.java new file mode 100644 index 000000000000..b240ac0e0130 --- /dev/null +++ b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/entity/User.java @@ -0,0 +1,31 @@ +package com.baeldung.entity; + +import jakarta.persistence.*; + +@Entity +@Table(name = "users") +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String name; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/repository/product/ProductRepository.java b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/repository/product/ProductRepository.java new file mode 100644 index 000000000000..8d31199fecfd --- /dev/null +++ b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/repository/product/ProductRepository.java @@ -0,0 +1,7 @@ +package com.baeldung.repository.product; + +import com.baeldung.entity.Product; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ProductRepository extends JpaRepository { +} diff --git a/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/repository/user/UserRepository.java b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/repository/user/UserRepository.java new file mode 100644 index 000000000000..649bd3706d5f --- /dev/null +++ b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/repository/user/UserRepository.java @@ -0,0 +1,7 @@ +package com.baeldung.repository.user; + +import com.baeldung.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserRepository extends JpaRepository { +} diff --git a/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/service/ProductService.java b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/service/ProductService.java new file mode 100644 index 000000000000..9ca13cbec349 --- /dev/null +++ b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/service/ProductService.java @@ -0,0 +1,27 @@ +package com.baeldung.service; + +import com.baeldung.entity.Product; +import com.baeldung.repository.product.ProductRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Optional; + +@Service +public class ProductService { + + private final ProductRepository repo; + + public ProductService(ProductRepository repo) { + this.repo = repo; + } + + @Transactional("productTransactionManager") + public void save(Product product) { + repo.save(product); + } + + public Optional findById(Long id) { + return repo.findById(id); + } +} diff --git a/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/service/UserService.java b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/service/UserService.java new file mode 100644 index 000000000000..4a0e5f0b6da5 --- /dev/null +++ b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/service/UserService.java @@ -0,0 +1,25 @@ +package com.baeldung.service; + +import com.baeldung.entity.User; +import com.baeldung.repository.user.UserRepository; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +public class UserService { + + private final UserRepository repo; + + public UserService(UserRepository repo) { + this.repo = repo; + } + + public void save(User user) { + repo.save(user); + } + + public Optional findById(Long id) { + return repo.findById(id); + } +} diff --git a/spring-boot-modules/flyway-multidb-springboot/src/main/resources/application.yml b/spring-boot-modules/flyway-multidb-springboot/src/main/resources/application.yml new file mode 100644 index 000000000000..dd223a321651 --- /dev/null +++ b/spring-boot-modules/flyway-multidb-springboot/src/main/resources/application.yml @@ -0,0 +1,27 @@ +spring: + datasource: + userdb: + url: jdbc:h2:mem:userdb + username: sa + password: + driver-class-name: org.h2.Driver + productdb: + url: jdbc:h2:mem:productdb + username: sa + password: + driver-class-name: org.h2.Driver + application: + name: flyway-multidb-springboot + + flyway: + enabled: false + jpa: + defer-datasource-initialization: false + hibernate: + ddl-auto: create-drop + main: + allow-circular-references: true + h2: + console: + enabled: true + path: /h2-console \ No newline at end of file diff --git a/spring-boot-modules/flyway-multidb-springboot/src/main/resources/db.migration/productdb/V1__create_products_table.sql b/spring-boot-modules/flyway-multidb-springboot/src/main/resources/db.migration/productdb/V1__create_products_table.sql new file mode 100644 index 000000000000..17bf51b163b3 --- /dev/null +++ b/spring-boot-modules/flyway-multidb-springboot/src/main/resources/db.migration/productdb/V1__create_products_table.sql @@ -0,0 +1,4 @@ +CREATE TABLE products ( + id BIGINT PRIMARY KEY, + name VARCHAR(255) +); diff --git a/spring-boot-modules/flyway-multidb-springboot/src/main/resources/db.migration/userdb/V1__create_users_table.sql b/spring-boot-modules/flyway-multidb-springboot/src/main/resources/db.migration/userdb/V1__create_users_table.sql new file mode 100644 index 000000000000..8b0f2b19d25b --- /dev/null +++ b/spring-boot-modules/flyway-multidb-springboot/src/main/resources/db.migration/userdb/V1__create_users_table.sql @@ -0,0 +1,4 @@ +CREATE TABLE users ( + id BIGINT PRIMARY KEY, + name VARCHAR(255) +); \ No newline at end of file diff --git a/spring-boot-modules/flyway-multidb-springboot/src/test/java/com/baeldung/flyway_multidb/FlywayMultidbApplicationTests.java b/spring-boot-modules/flyway-multidb-springboot/src/test/java/com/baeldung/flyway_multidb/FlywayMultidbApplicationTests.java new file mode 100644 index 000000000000..9e83fb54d685 --- /dev/null +++ b/spring-boot-modules/flyway-multidb-springboot/src/test/java/com/baeldung/flyway_multidb/FlywayMultidbApplicationTests.java @@ -0,0 +1,13 @@ +package com.baeldung; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class FlywayMultidbApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/spring-boot-modules/flyway-multidb-springboot/src/test/java/com/baeldung/service/MultiDbServiceTest.java b/spring-boot-modules/flyway-multidb-springboot/src/test/java/com/baeldung/service/MultiDbServiceTest.java new file mode 100644 index 000000000000..b9d0854cd18b --- /dev/null +++ b/spring-boot-modules/flyway-multidb-springboot/src/test/java/com/baeldung/service/MultiDbServiceTest.java @@ -0,0 +1,47 @@ +package com.baeldung.service; + +import com.baeldung.entity.User; +import com.baeldung.entity.Product; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +class MultiDbServiceTest { + + @Autowired + private UserService userService; + + @Autowired + private ProductService productService; + + @Transactional("productTransactionManager") + @Test + void givenUsersAndProducts_whenSaved_thenFoundById() { + User user = new User(); + user.setId(1L); + user.setName("Alice"); + + Product product = new Product(); + product.setId(100L); + product.setName("Laptop"); + + productService.save(product); + userService.save(user); + + Optional retrievedUser = userService.findById(1L); + Optional retrievedProduct = productService.findById(100L); + + assertTrue(retrievedUser.isPresent()); + assertEquals("Alice", retrievedUser.get().getName()); + + assertTrue(retrievedProduct.isPresent()); + assertEquals("Laptop", retrievedProduct.get().getName()); + } +} diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index 838b856b8814..0c6caab2ce93 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -17,6 +17,7 @@ + flyway-multidb-springboot spring-boot-admin spring-boot-angular spring-boot-annotations From 27dc4fa243ea7a746da994f802a52a43bdca47e7 Mon Sep 17 00:00:00 2001 From: sverma1-godaddy Date: Thu, 7 Aug 2025 10:32:15 +0530 Subject: [PATCH 2/6] addressing all the PR comments --- .../flyway-multidb-springboot/pom.xml | 9 ++++----- .../com/baeldung/config/ProductDbConfig.java | 10 ++++------ .../main/java/com/baeldung/entity/Product.java | 1 + .../com/baeldung/service/ProductService.java | 4 ++-- .../java/com/baeldung/service/UserService.java | 6 ++++-- .../src/main/resources/application.yml | 2 +- .../productdb/V1__create_products_table.sql | 2 +- ...viceTest.java => MultiDbServiceLiveTest.java} | 16 +++++++++------- 8 files changed, 26 insertions(+), 24 deletions(-) rename spring-boot-modules/flyway-multidb-springboot/src/test/java/com/baeldung/service/{MultiDbServiceTest.java => MultiDbServiceLiveTest.java} (73%) diff --git a/spring-boot-modules/flyway-multidb-springboot/pom.xml b/spring-boot-modules/flyway-multidb-springboot/pom.xml index 17e44773efd1..1bba76e45d60 100644 --- a/spring-boot-modules/flyway-multidb-springboot/pom.xml +++ b/spring-boot-modules/flyway-multidb-springboot/pom.xml @@ -18,24 +18,23 @@ org.springframework.boot spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-web + 3.2.3 org.flywaydb flyway-core + 9.22.3 - com.h2database h2 + 2.2.224 runtime org.springframework.boot spring-boot-starter-test + 3.2.3 test diff --git a/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/ProductDbConfig.java b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/ProductDbConfig.java index bc3815a194a6..6f17097ebff9 100644 --- a/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/ProductDbConfig.java +++ b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/ProductDbConfig.java @@ -52,13 +52,11 @@ public PlatformTransactionManager productTransactionManager( } @PostConstruct - public Flyway migrateProductDb() { - Flyway flyway = Flyway.configure() + public void migrateProductDb() { + Flyway.configure() .dataSource(productDataSource()) .locations("classpath:db/migration/productdb") - .load(); - flyway.migrate(); - - return flyway; + .load() + .migrate(); } } diff --git a/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/entity/Product.java b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/entity/Product.java index ad164780b21a..3e98de0f5a53 100644 --- a/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/entity/Product.java +++ b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/entity/Product.java @@ -7,6 +7,7 @@ public class Product { @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "product_seq") private Long id; private String name; diff --git a/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/service/ProductService.java b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/service/ProductService.java index 9ca13cbec349..a9cd0d947825 100644 --- a/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/service/ProductService.java +++ b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/service/ProductService.java @@ -17,8 +17,8 @@ public ProductService(ProductRepository repo) { } @Transactional("productTransactionManager") - public void save(Product product) { - repo.save(product); + public Product save(Product product) { + return repo.save(product); } public Optional findById(Long id) { diff --git a/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/service/UserService.java b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/service/UserService.java index 4a0e5f0b6da5..a929380aca51 100644 --- a/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/service/UserService.java +++ b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/service/UserService.java @@ -3,6 +3,7 @@ import com.baeldung.entity.User; import com.baeldung.repository.user.UserRepository; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.Optional; @@ -15,8 +16,9 @@ public UserService(UserRepository repo) { this.repo = repo; } - public void save(User user) { - repo.save(user); + @Transactional("userTransactionManager") + public User save(User user) { + return repo.save(user); } public Optional findById(Long id) { diff --git a/spring-boot-modules/flyway-multidb-springboot/src/main/resources/application.yml b/spring-boot-modules/flyway-multidb-springboot/src/main/resources/application.yml index dd223a321651..ef5f2e9d055f 100644 --- a/spring-boot-modules/flyway-multidb-springboot/src/main/resources/application.yml +++ b/spring-boot-modules/flyway-multidb-springboot/src/main/resources/application.yml @@ -18,7 +18,7 @@ spring: jpa: defer-datasource-initialization: false hibernate: - ddl-auto: create-drop + ddl-auto: validate main: allow-circular-references: true h2: diff --git a/spring-boot-modules/flyway-multidb-springboot/src/main/resources/db.migration/productdb/V1__create_products_table.sql b/spring-boot-modules/flyway-multidb-springboot/src/main/resources/db.migration/productdb/V1__create_products_table.sql index 17bf51b163b3..3b317f23f059 100644 --- a/spring-boot-modules/flyway-multidb-springboot/src/main/resources/db.migration/productdb/V1__create_products_table.sql +++ b/spring-boot-modules/flyway-multidb-springboot/src/main/resources/db.migration/productdb/V1__create_products_table.sql @@ -1,4 +1,4 @@ CREATE TABLE products ( - id BIGINT PRIMARY KEY, + id BIGINT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) ); diff --git a/spring-boot-modules/flyway-multidb-springboot/src/test/java/com/baeldung/service/MultiDbServiceTest.java b/spring-boot-modules/flyway-multidb-springboot/src/test/java/com/baeldung/service/MultiDbServiceLiveTest.java similarity index 73% rename from spring-boot-modules/flyway-multidb-springboot/src/test/java/com/baeldung/service/MultiDbServiceTest.java rename to spring-boot-modules/flyway-multidb-springboot/src/test/java/com/baeldung/service/MultiDbServiceLiveTest.java index b9d0854cd18b..fc0b75beedbb 100644 --- a/spring-boot-modules/flyway-multidb-springboot/src/test/java/com/baeldung/service/MultiDbServiceTest.java +++ b/spring-boot-modules/flyway-multidb-springboot/src/test/java/com/baeldung/service/MultiDbServiceLiveTest.java @@ -13,7 +13,7 @@ import static org.junit.jupiter.api.Assertions.*; @SpringBootTest -class MultiDbServiceTest { +class MultiDbServiceLiveTest { @Autowired private UserService userService; @@ -25,19 +25,21 @@ class MultiDbServiceTest { @Test void givenUsersAndProducts_whenSaved_thenFoundById() { User user = new User(); - user.setId(1L); user.setName("Alice"); Product product = new Product(); - product.setId(100L); product.setName("Laptop"); - productService.save(product); - userService.save(user); + // Save and capture returned entities to get generated IDs + Product savedProduct = productService.save(product); + User savedUser = userService.save(user); - Optional retrievedUser = userService.findById(1L); - Optional retrievedProduct = productService.findById(100L); + // Use the generated IDs for retrieval + Optional retrievedUser = userService.findById(savedUser.getId()); + Optional retrievedProduct = productService.findById(savedProduct.getId()); + + // Assertions assertTrue(retrievedUser.isPresent()); assertEquals("Alice", retrievedUser.get().getName()); From 28b2b3eda9b734462bb4a61fdeae3eff9b43d468 Mon Sep 17 00:00:00 2001 From: sverma1-godaddy Date: Thu, 7 Aug 2025 14:42:40 +0530 Subject: [PATCH 3/6] updating correct props of ddl-auto --- .../src/main/java/com/baeldung/config/ProductDbConfig.java | 2 +- .../src/main/java/com/baeldung/config/UserDbConfig.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/ProductDbConfig.java b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/ProductDbConfig.java index 6f17097ebff9..cc319b7036bc 100644 --- a/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/ProductDbConfig.java +++ b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/ProductDbConfig.java @@ -40,7 +40,7 @@ public LocalContainerEntityManagerFactoryBean productEntityManagerFactory( .dataSource(productDataSource()) .packages("com.baeldung.entity") .persistenceUnit("productPU") - .properties(Map.of("hibernate.hbm2ddl.auto", "create-drop")) + .properties(Map.of("hibernate.hbm2ddl.auto", "create")) .build(); } diff --git a/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/UserDbConfig.java b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/UserDbConfig.java index 2ff435af85ce..22f1b9669ce2 100644 --- a/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/UserDbConfig.java +++ b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/UserDbConfig.java @@ -46,7 +46,7 @@ public LocalContainerEntityManagerFactoryBean userEntityManagerFactory( .dataSource(userDataSource()) .packages("com.baeldung.entity") .persistenceUnit("userPU") - .properties(Map.of("hibernate.hbm2ddl.auto", "create-drop")) + .properties(Map.of("hibernate.hbm2ddl.auto", "create")) .build(); } From a6dee0b6acbdebbbfce0afc73604e0c6460f2f0c Mon Sep 17 00:00:00 2001 From: sverma1-godaddy Date: Thu, 7 Aug 2025 14:48:09 +0530 Subject: [PATCH 4/6] refactoring --- .../src/main/java/com/baeldung/config/ProductDbConfig.java | 2 +- .../src/main/java/com/baeldung/config/UserDbConfig.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/ProductDbConfig.java b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/ProductDbConfig.java index cc319b7036bc..63d9a299192a 100644 --- a/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/ProductDbConfig.java +++ b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/ProductDbConfig.java @@ -40,7 +40,7 @@ public LocalContainerEntityManagerFactoryBean productEntityManagerFactory( .dataSource(productDataSource()) .packages("com.baeldung.entity") .persistenceUnit("productPU") - .properties(Map.of("hibernate.hbm2ddl.auto", "create")) + .properties(Map.of("hibernate.hbm2ddl.auto", "none")) .build(); } diff --git a/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/UserDbConfig.java b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/UserDbConfig.java index 22f1b9669ce2..ca9148e6f7f1 100644 --- a/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/UserDbConfig.java +++ b/spring-boot-modules/flyway-multidb-springboot/src/main/java/com/baeldung/config/UserDbConfig.java @@ -46,7 +46,7 @@ public LocalContainerEntityManagerFactoryBean userEntityManagerFactory( .dataSource(userDataSource()) .packages("com.baeldung.entity") .persistenceUnit("userPU") - .properties(Map.of("hibernate.hbm2ddl.auto", "create")) + .properties(Map.of("hibernate.hbm2ddl.auto", "none")) .build(); } From c5ed87044aec98eb59ca8e3103822a5087ea155b Mon Sep 17 00:00:00 2001 From: sverma1-godaddy Date: Thu, 7 Aug 2025 14:51:38 +0530 Subject: [PATCH 5/6] updating app config --- .../src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-modules/flyway-multidb-springboot/src/main/resources/application.yml b/spring-boot-modules/flyway-multidb-springboot/src/main/resources/application.yml index ef5f2e9d055f..88eadb7d893d 100644 --- a/spring-boot-modules/flyway-multidb-springboot/src/main/resources/application.yml +++ b/spring-boot-modules/flyway-multidb-springboot/src/main/resources/application.yml @@ -18,7 +18,7 @@ spring: jpa: defer-datasource-initialization: false hibernate: - ddl-auto: validate + ddl-auto: none main: allow-circular-references: true h2: From 3bf5a4a38956a1dd18ca3ba155ac36d72629fece Mon Sep 17 00:00:00 2001 From: sverma1-godaddy Date: Thu, 14 Aug 2025 09:48:19 +0530 Subject: [PATCH 6/6] comments addressed --- .../flyway-multidb-springboot/pom.xml | 6 ----- .../service/MultiDbServiceLiveTest.java | 27 +++++++------------ 2 files changed, 9 insertions(+), 24 deletions(-) diff --git a/spring-boot-modules/flyway-multidb-springboot/pom.xml b/spring-boot-modules/flyway-multidb-springboot/pom.xml index 1bba76e45d60..ddec01826dc3 100644 --- a/spring-boot-modules/flyway-multidb-springboot/pom.xml +++ b/spring-boot-modules/flyway-multidb-springboot/pom.xml @@ -37,12 +37,6 @@ 3.2.3 test - - org.testng - testng - RELEASE - compile - diff --git a/spring-boot-modules/flyway-multidb-springboot/src/test/java/com/baeldung/service/MultiDbServiceLiveTest.java b/spring-boot-modules/flyway-multidb-springboot/src/test/java/com/baeldung/service/MultiDbServiceLiveTest.java index fc0b75beedbb..7933daf37305 100644 --- a/spring-boot-modules/flyway-multidb-springboot/src/test/java/com/baeldung/service/MultiDbServiceLiveTest.java +++ b/spring-boot-modules/flyway-multidb-springboot/src/test/java/com/baeldung/service/MultiDbServiceLiveTest.java @@ -7,6 +7,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; +import com.baeldung.repository.user.UserRepository; +import com.baeldung.repository.product.ProductRepository; import java.util.Optional; @@ -16,34 +18,23 @@ class MultiDbServiceLiveTest { @Autowired - private UserService userService; + private UserRepository userRepository; @Autowired - private ProductService productService; + private ProductRepository productRepository; @Transactional("productTransactionManager") @Test void givenUsersAndProducts_whenSaved_thenFoundById() { User user = new User(); - user.setName("Alice"); + user.setName("John"); + userRepository.save(user); Product product = new Product(); product.setName("Laptop"); + productRepository.save(product); - // Save and capture returned entities to get generated IDs - Product savedProduct = productService.save(product); - User savedUser = userService.save(user); - - - // Use the generated IDs for retrieval - Optional retrievedUser = userService.findById(savedUser.getId()); - Optional retrievedProduct = productService.findById(savedProduct.getId()); - - // Assertions - assertTrue(retrievedUser.isPresent()); - assertEquals("Alice", retrievedUser.get().getName()); - - assertTrue(retrievedProduct.isPresent()); - assertEquals("Laptop", retrievedProduct.get().getName()); + assertTrue(userRepository.findById(user.getId()).isPresent()); + assertTrue(productRepository.findById(product.getId()).isPresent()); } }