From 76ff0d25cfd9d5aabc312770eaf4d64bf3213431 Mon Sep 17 00:00:00 2001
From: Blockchain-Trainer
<46881425+blockchain-trainer@users.noreply.github.com>
Date: Thu, 28 Mar 2019 16:03:40 +0530
Subject: [PATCH] [BAEL-2718] - Spring JPA Batch Inserts (#6333)
* [BAEL-2718] - Spring JPA Batch Inserts
* [BAEL-2718] - Spring JPA Batch Inserts (New PR)
* [BAEL-2718] - Spring JPA Batch Inserts New PR
* [BAEL-2718] - Spring JPA Batch Inserts
* BAEL-2718 - formatting (tab to space)
---
persistence-modules/spring-data-jpa/pom.xml | 9 +++
.../batchinserts/CustomerController.java | 43 ++++++++++++++
.../baeldung/batchinserts/model/Customer.java | 56 +++++++++++++++++++
.../repository/CustomerRepository.java | 15 +++++
.../src/main/resources/application.properties | 7 ++-
.../BatchInsertIntegrationTest.java | 44 +++++++++++++++
6 files changed, 173 insertions(+), 1 deletion(-)
create mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/batchinserts/CustomerController.java
create mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/batchinserts/model/Customer.java
create mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/batchinserts/repository/CustomerRepository.java
create mode 100644 persistence-modules/spring-data-jpa/src/test/java/com/baeldung/batchinserts/BatchInsertIntegrationTest.java
diff --git a/persistence-modules/spring-data-jpa/pom.xml b/persistence-modules/spring-data-jpa/pom.xml
index 401f4877ac..c512994931 100644
--- a/persistence-modules/spring-data-jpa/pom.xml
+++ b/persistence-modules/spring-data-jpa/pom.xml
@@ -53,6 +53,15 @@
spring-security-test
test
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
com.google.guava
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/batchinserts/CustomerController.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/batchinserts/CustomerController.java
new file mode 100644
index 0000000000..7623d4d166
--- /dev/null
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/batchinserts/CustomerController.java
@@ -0,0 +1,43 @@
+package com.baeldung.batchinserts;
+
+import java.net.URISyntaxException;
+import java.util.Arrays;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.baeldung.batchinserts.model.Customer;
+import com.baeldung.batchinserts.repository.CustomerRepository;
+
+/**
+ * A simple controller to test the JPA CrudRepository operations
+ * controllers
+ *
+ * @author ysharma2512
+ *
+ */
+@RestController
+public class CustomerController {
+
+ @Autowired
+ CustomerRepository customerRepository;
+
+ public CustomerController(CustomerRepository customerRepository2) {
+ this.customerRepository = customerRepository2;
+ }
+
+ @PostMapping("/customers")
+ public ResponseEntity> insertCustomers() throws URISyntaxException {
+ Customer c1 = new Customer("James", "Gosling");
+ Customer c2 = new Customer("Doug", "Lea");
+ Customer c3 = new Customer("Martin", "Fowler");
+ Customer c4 = new Customer("Brian", "Goetz");
+ List customers = Arrays.asList(c1, c2, c3, c4);
+ customerRepository.saveAll(customers);
+ return ResponseEntity.ok(customers);
+ }
+
+}
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/batchinserts/model/Customer.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/batchinserts/model/Customer.java
new file mode 100644
index 0000000000..4d82cf12a2
--- /dev/null
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/batchinserts/model/Customer.java
@@ -0,0 +1,56 @@
+package com.baeldung.batchinserts.model;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+/**
+ * Customer Entity class
+ * @author ysharma2512
+ *
+ */
+@Entity
+public class Customer {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private Long id;
+ private String firstName;
+ private String lastName;
+
+ public Customer(String firstName, String lastName) {
+ this.firstName = firstName;
+ this.lastName = lastName;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("Customer[id=%d, firstName='%s', lastName='%s']", id, firstName, lastName);
+ }
+
+}
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/batchinserts/repository/CustomerRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/batchinserts/repository/CustomerRepository.java
new file mode 100644
index 0000000000..ab0214bade
--- /dev/null
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/batchinserts/repository/CustomerRepository.java
@@ -0,0 +1,15 @@
+package com.baeldung.batchinserts.repository;
+
+import org.springframework.data.repository.CrudRepository;
+
+import com.baeldung.batchinserts.model.Customer;
+
+/**
+ * JPA CrudRepository interface
+ *
+ * @author ysharma2512
+ *
+ */
+public interface CustomerRepository extends CrudRepository{
+
+}
diff --git a/persistence-modules/spring-data-jpa/src/main/resources/application.properties b/persistence-modules/spring-data-jpa/src/main/resources/application.properties
index 37fb9ca9c4..239f81db7b 100644
--- a/persistence-modules/spring-data-jpa/src/main/resources/application.properties
+++ b/persistence-modules/spring-data-jpa/src/main/resources/application.properties
@@ -14,4 +14,9 @@ hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFa
spring.datasource.data=import_entities.sql
-spring.main.allow-bean-definition-overriding=true
\ No newline at end of file
+spring.main.allow-bean-definition-overriding=true
+
+spring.jpa.properties.hibernate.jdbc.batch_size=4
+spring.jpa.properties.hibernate.order_inserts=true
+spring.jpa.properties.hibernate.order_updates=true
+spring.jpa.properties.hibernate.generate_statistics=true
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/batchinserts/BatchInsertIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/batchinserts/BatchInsertIntegrationTest.java
new file mode 100644
index 0000000000..f60e0d21bf
--- /dev/null
+++ b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/batchinserts/BatchInsertIntegrationTest.java
@@ -0,0 +1,44 @@
+package com.baeldung.batchinserts;
+
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+
+import com.baeldung.batchinserts.CustomerController;
+import com.baeldung.batchinserts.repository.CustomerRepository;
+import com.baeldung.config.PersistenceConfiguration;
+import com.baeldung.config.PersistenceProductConfiguration;
+import com.baeldung.config.PersistenceUserConfiguration;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@AutoConfigureMockMvc
+@ContextConfiguration(classes = { PersistenceConfiguration.class, PersistenceProductConfiguration.class, PersistenceUserConfiguration.class })
+public class BatchInsertIntegrationTest {
+
+ @Autowired
+ private CustomerRepository customerRepository;
+ private MockMvc mockMvc;
+ @Before
+ public void setUp() throws Exception {
+ mockMvc = MockMvcBuilders.standaloneSetup( new CustomerController(customerRepository))
+ .build();
+ }
+
+ @Test
+ public void whenInsertingCustomers_thenCustomersAreCreated() throws Exception {
+ this.mockMvc.perform(post("/customers"))
+ .andExpect(status().isOk());
+ }
+
+}
\ No newline at end of file