diff --git a/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/bootstrapmode/Application.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/bootstrapmode/Application.java new file mode 100644 index 0000000000..0bb1884f23 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/bootstrapmode/Application.java @@ -0,0 +1,50 @@ +package com.baeldung.boot.bootstrapmode; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.Future; + +import javax.sql.DataSource; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.core.task.AsyncTaskExecutor; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +@SpringBootApplication +public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + + @Bean + AsyncTaskExecutor delayedTaskExecutor() { + return new ThreadPoolTaskExecutor() { + @Override + public Future submit(Callable task) { + return super.submit(() -> { + Thread.sleep(5000); + return task.call(); + }); + } + }; + } + + @Bean + LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource, AsyncTaskExecutor delayedTaskExecutor) { + LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); + factory.setPackagesToScan("com.baeldung.boot.bootstrapmode"); + factory.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); + factory.setDataSource(dataSource); + factory.setBootstrapExecutor(delayedTaskExecutor); + Map properties = new HashMap<>(); + properties.put("hibernate.hbm2ddl.auto", "create-drop"); + factory.setJpaPropertyMap(properties); + return factory; + } +} + diff --git a/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/bootstrapmode/domain/Todo.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/bootstrapmode/domain/Todo.java new file mode 100644 index 0000000000..8d6ab3cfb8 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/bootstrapmode/domain/Todo.java @@ -0,0 +1,37 @@ +package com.baeldung.boot.bootstrapmode.domain; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Todo { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + private String label; + + public Todo() { + } + + public Todo(String label) { + this.label = label; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getId() { + return id; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } +} diff --git a/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/bootstrapmode/repository/TodoRepository.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/bootstrapmode/repository/TodoRepository.java new file mode 100644 index 0000000000..b32d1c5085 --- /dev/null +++ b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/bootstrapmode/repository/TodoRepository.java @@ -0,0 +1,8 @@ +package com.baeldung.boot.bootstrapmode.repository; + +import org.springframework.data.repository.CrudRepository; + +import com.baeldung.boot.bootstrapmode.domain.Todo; + +public interface TodoRepository extends CrudRepository { +} diff --git a/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/bootstrapmode/BootstrapmodeDefaultIntegrationTest.java b/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/bootstrapmode/BootstrapmodeDefaultIntegrationTest.java new file mode 100644 index 0000000000..3ff743299b --- /dev/null +++ b/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/bootstrapmode/BootstrapmodeDefaultIntegrationTest.java @@ -0,0 +1,24 @@ +package com.baeldung.boot.bootstrapmode; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import com.baeldung.boot.bootstrapmode.domain.Todo; +import com.baeldung.boot.bootstrapmode.repository.TodoRepository; + +@DataJpaTest +class BootstrapmodeDefaultIntegrationTest { + + @Autowired + private TodoRepository todoRepository; + + @Test + void givenBootstrapmodeValueIsDefault_whenCreatingTodo_shouldSuccess() { + Todo todo = new Todo("Something to be done"); + + assertThat(todoRepository.save(todo)).hasNoNullFieldsOrProperties(); + } +} diff --git a/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/bootstrapmode/BootstrapmodeDeferredIntegrationTest.java b/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/bootstrapmode/BootstrapmodeDeferredIntegrationTest.java new file mode 100644 index 0000000000..02110519df --- /dev/null +++ b/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/bootstrapmode/BootstrapmodeDeferredIntegrationTest.java @@ -0,0 +1,25 @@ +package com.baeldung.boot.bootstrapmode; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.data.repository.config.BootstrapMode; + +import com.baeldung.boot.bootstrapmode.domain.Todo; +import com.baeldung.boot.bootstrapmode.repository.TodoRepository; + +@DataJpaTest(bootstrapMode = BootstrapMode.DEFERRED) +class BootstrapmodeDeferredIntegrationTest { + + @Autowired + private TodoRepository todoRepository; + + @Test + void givenBootstrapmodeValueIsDeferred_whenCreatingTodo_shouldSuccess() { + Todo todo = new Todo("Something to be done"); + + assertThat(todoRepository.save(todo)).hasNoNullFieldsOrProperties(); + } +} diff --git a/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/bootstrapmode/BootstrapmodeLazyIntegrationTest.java b/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/bootstrapmode/BootstrapmodeLazyIntegrationTest.java new file mode 100644 index 0000000000..eb5ddfa6ca --- /dev/null +++ b/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/bootstrapmode/BootstrapmodeLazyIntegrationTest.java @@ -0,0 +1,25 @@ +package com.baeldung.boot.bootstrapmode; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.data.repository.config.BootstrapMode; + +import com.baeldung.boot.bootstrapmode.domain.Todo; +import com.baeldung.boot.bootstrapmode.repository.TodoRepository; + +@DataJpaTest(bootstrapMode = BootstrapMode.LAZY) +class BootstrapmodeLazyIntegrationTest { + + @Autowired + private TodoRepository todoRepository; + + @Test + void givenBootstrapmodeValueIsLazy_whenCreatingTodo_shouldSuccess() { + Todo todo = new Todo("Something to be done"); + + assertThat(todoRepository.save(todo)).hasNoNullFieldsOrProperties(); + } +}