diff --git a/persistence-modules/spring-data-jpa-2/README.md b/persistence-modules/spring-data-jpa-2/README.md
new file mode 100644
index 0000000000..8dff49640e
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-2/README.md
@@ -0,0 +1,34 @@
+=========
+
+## Spring Data JPA Example Project
+
+### Relevant Articles:
+- [Spring JPA – Multiple Databases](http://www.baeldung.com/spring-data-jpa-multiple-databases)
+- [Spring Data JPA – Adding a Method in All Repositories](http://www.baeldung.com/spring-data-jpa-method-in-all-repositories)
+- [Advanced Tagging Implementation with JPA](http://www.baeldung.com/jpa-tagging-advanced)
+- [Spring Data JPA @Query](http://www.baeldung.com/spring-data-jpa-query)
+- [Spring Data Annotations](http://www.baeldung.com/spring-data-annotations)
+- [Spring Data Java 8 Support](http://www.baeldung.com/spring-data-java-8)
+- [A Simple Tagging Implementation with JPA](http://www.baeldung.com/jpa-tagging)
+- [Spring Data Composable Repositories](https://www.baeldung.com/spring-data-composable-repositories)
+- [Auditing with JPA, Hibernate, and Spring Data JPA](https://www.baeldung.com/database-auditing-jpa)
+- [Query Entities by Dates and Times with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-query-by-date)
+- [DDD Aggregates and @DomainEvents](https://www.baeldung.com/spring-data-ddd)
+- [Spring Data – CrudRepository save() Method](https://www.baeldung.com/spring-data-crud-repository-save)
+- [Limiting Query Results with JPA and Spring Data JPA](https://www.baeldung.com/jpa-limit-query-results)
+- [Sorting Query Results with Spring Data](https://www.baeldung.com/spring-data-sorting)
+- [INSERT Statement in JPA](https://www.baeldung.com/jpa-insert)
+- [Pagination and Sorting using Spring Data JPA](https://www.baeldung.com/spring-data-jpa-pagination-sorting)
+- [Spring Data JPA Query by Example](https://www.baeldung.com/spring-data-query-by-example)
+- [DB Integration Tests with Spring Boot and Testcontainers](https://www.baeldung.com/spring-boot-testcontainers-integration-test)
+- [Spring Data JPA @Modifying Annotation](https://www.baeldung.com/spring-data-jpa-modifying-annotation)
+
+### Eclipse Config
+After importing the project into Eclipse, you may see the following error:
+"No persistence xml file found in project"
+
+This can be ignored:
+- Project -> Properties -> Java Persistance -> JPA -> Error/Warnings -> Select Ignore on "No persistence xml file found in project"
+Or:
+- Eclipse -> Preferences - Validation - disable the "Build" execution of the JPA Validator
+
diff --git a/persistence-modules/spring-data-jpa-2/pom.xml b/persistence-modules/spring-data-jpa-2/pom.xml
new file mode 100644
index 0000000000..8e46112659
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-2/pom.xml
@@ -0,0 +1,30 @@
+
+
+ 4.0.0
+ com.baeldung
+ spring-data-jpa-2
+ spring-data-jpa
+
+
+ parent-boot-2
+ com.baeldung
+ 0.0.1-SNAPSHOT
+ ../../parent-boot-2
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+
+ com.h2database
+ h2
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/Application.java b/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/Application.java
new file mode 100644
index 0000000000..3ea3d113da
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/Application.java
@@ -0,0 +1,13 @@
+package com.baeldung;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
diff --git a/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/entity/Fruit.java b/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/entity/Fruit.java
new file mode 100644
index 0000000000..f82022e67e
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/entity/Fruit.java
@@ -0,0 +1,38 @@
+package com.baeldung.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+@Entity
+public class Fruit {
+
+ @Id
+ private long id;
+ private String name;
+ private String color;
+
+ 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;
+ }
+
+ public String getColor() {
+ return color;
+ }
+
+ public void setColor(String color) {
+ this.color = color;
+ }
+
+}
diff --git a/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/repository/FruitRepository.java b/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/repository/FruitRepository.java
new file mode 100644
index 0000000000..9f92909b66
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/repository/FruitRepository.java
@@ -0,0 +1,27 @@
+package com.baeldung.repository;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import com.baeldung.entity.Fruit;
+
+@Repository
+public interface FruitRepository extends JpaRepository {
+
+ Long deleteByName(String name);
+
+ List deleteByColor(String color);
+
+ Long removeByName(String name);
+
+ List removeByColor(String color);
+
+ @Modifying
+ @Query("delete from Fruit f where f.name=:name or f.color=:color")
+ List deleteFruits(@Param("name") String name, @Param("color") String color);
+}
diff --git a/persistence-modules/spring-data-jpa-2/src/main/resources/application.properties b/persistence-modules/spring-data-jpa-2/src/main/resources/application.properties
new file mode 100644
index 0000000000..72fc330767
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-2/src/main/resources/application.properties
@@ -0,0 +1 @@
+spring.jpa.show-sql=true
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/repository/FruitRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/repository/FruitRepositoryIntegrationTest.java
new file mode 100644
index 0000000000..74188497ee
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/repository/FruitRepositoryIntegrationTest.java
@@ -0,0 +1,77 @@
+package com.baeldung.repository;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+
+import org.junit.jupiter.api.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.jdbc.Sql;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.baeldung.entity.Fruit;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+class FruitRepositoryIntegrationTest {
+
+ @Autowired
+ private FruitRepository fruitRepository;
+
+ @Transactional
+ @Test
+ @Sql(scripts = { "/test-fruit-data.sql" })
+ public void givenFruits_WhenDeletedByColor_DeletedFruitShouldReturn() {
+
+ List fruits = fruitRepository.deleteByColor("green");
+
+ assertEquals("number of fruits are not matching", 2, fruits.size());
+ fruits.forEach(fruit -> assertEquals("Its not a green fruit", "green", fruit.getColor()));
+ }
+
+ @Transactional
+ @Test
+ @Sql(scripts = { "/test-fruit-data.sql" })
+ public void givenFruits_WhenDeletedByName_DeletedFruitCountShouldReturn() {
+
+ Long deletedFruitCount = fruitRepository.deleteByName("apple");
+
+ assertEquals("deleted fruit count is not matching", 1, deletedFruitCount.intValue());
+ }
+
+ @Transactional
+ @Test
+ @Sql(scripts = { "/test-fruit-data.sql" })
+ public void givenFruits_WhenRemovedByColor_DeletedFruitShouldReturn() {
+
+ List fruits = fruitRepository.removeByColor("green");
+
+ assertEquals("number of fruits are not matching", 2, fruits.size());
+ fruits.forEach(fruit -> assertEquals("Its not a green fruit", "green", fruit.getColor()));
+ }
+
+ @Transactional
+ @Test
+ @Sql(scripts = { "/test-fruit-data.sql" })
+ public void givenFruits_WhenRemovedByName_DeletedFruitCountShouldReturn() {
+
+ Long deletedFruitCount = fruitRepository.removeByName("apple");
+
+ assertEquals("deleted fruit count is not matching", 1, deletedFruitCount.intValue());
+ }
+
+ @Transactional
+ @Test
+ @Sql(scripts = { "/test-fruit-data.sql" })
+ public void givenFruits_WhenDeletedByColorOrName_DeletedFruitShouldReturn() {
+
+ List fruits = fruitRepository.deleteFruits("apple", "green");
+
+ assertEquals("number of fruits are not matching", 3, fruits.size());
+ fruits.forEach(fruit -> assertTrue("Its not a green fruit or apple", ("green".equals(fruit.getColor())) || "apple".equals(fruit.getColor())));
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-2/src/test/resources/test-fruit-data.sql b/persistence-modules/spring-data-jpa-2/src/test/resources/test-fruit-data.sql
new file mode 100644
index 0000000000..ce2189121f
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-2/src/test/resources/test-fruit-data.sql
@@ -0,0 +1,4 @@
+insert into fruit(id,name,color) values (1,'apple','red');
+insert into fruit(id,name,color) values (2,'custard apple','green');
+insert into fruit(id,name,color) values (3,'mango','yellow');
+insert into fruit(id,name,color) values (4,'guava','green');
\ No newline at end of file