diff --git a/persistence-modules/spring-data-jpa-crud/pom.xml b/persistence-modules/spring-data-jpa-crud/pom.xml
index 16ee74aa62..4afb75d737 100644
--- a/persistence-modules/spring-data-jpa-crud/pom.xml
+++ b/persistence-modules/spring-data-jpa-crud/pom.xml
@@ -33,6 +33,11 @@
com.h2database
h2
+
+ mysql
+ mysql-connector-java
+ runtime
+
net.ttddyy
datasource-proxy
diff --git a/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/Product.java b/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/Product.java
new file mode 100644
index 0000000000..543252e474
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/Product.java
@@ -0,0 +1,69 @@
+package com.baeldung.softdelete;
+
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.Filter;
+import org.hibernate.annotations.FilterDef;
+import org.hibernate.annotations.ParamDef;
+import org.hibernate.annotations.SQLDelete;
+
+@Entity
+@Table(name = "tbl_products")
+@SQLDelete(sql = "UPDATE tbl_products SET deleted = true WHERE id=?")
+// @Where(clause = "deleted=false")
+@FilterDef(name = "deletedProductFilter", parameters = @ParamDef(name = "isDeleted", type = "boolean"))
+@Filter(name = "deletedProductFilter", condition = "deleted = :isDeleted")
+public class Product implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ private String name;
+
+ private double price;
+
+ private boolean deleted = Boolean.FALSE;
+
+ 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 double getPrice() {
+ return price;
+ }
+
+ public void setPrice(double price) {
+ this.price = price;
+ }
+
+ public boolean isDeleted() {
+ return deleted;
+ }
+
+ public void setDeleted(boolean deleted) {
+ this.deleted = deleted;
+ }
+
+}
diff --git a/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductController.java b/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductController.java
new file mode 100644
index 0000000000..ebfdfbb2e7
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductController.java
@@ -0,0 +1,34 @@
+package com.baeldung.softdelete;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/api/products")
+public class ProductController {
+
+ @Autowired
+ private ProductService productService;
+
+ @PostMapping
+ public Product createOne(@RequestBody Product product) {
+ return productService.create(product);
+ }
+
+ @DeleteMapping("/{id}")
+ public void removeOne(@PathVariable("id") Long id) {
+ productService.remove(id);
+ }
+
+ @GetMapping
+ public Iterable findAll(@RequestParam(value = "isDeleted", required = false, defaultValue = "false") boolean isDeleted) {
+ return productService.findAll(isDeleted);
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductRepository.java b/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductRepository.java
new file mode 100644
index 0000000000..a305a142aa
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductRepository.java
@@ -0,0 +1,7 @@
+package com.baeldung.softdelete;
+
+import org.springframework.data.repository.CrudRepository;
+
+public interface ProductRepository extends CrudRepository{
+
+}
diff --git a/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductService.java b/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductService.java
new file mode 100644
index 0000000000..2bced0c4d8
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductService.java
@@ -0,0 +1,36 @@
+package com.baeldung.softdelete;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.Filter;
+import org.hibernate.Session;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ProductService {
+
+ @Autowired
+ private ProductRepository productRepository;
+
+ @Autowired
+ private EntityManager entityManager;
+
+ public Product create(Product product) {
+ return productRepository.save(product);
+ }
+
+ public void remove(Long id){
+ productRepository.deleteById(id);
+ }
+
+ public Iterable findAll(boolean isDeleted){
+ //return productRepository.findAll();
+ Session session = entityManager.unwrap(Session.class);
+ Filter filter = session.enableFilter("deletedProductFilter");
+ filter.setParameter("isDeleted", isDeleted);
+ Iterable products = productRepository.findAll();
+ session.disableFilter("deletedProductFilter");
+ return products;
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-crud/src/main/resources/application.properties b/persistence-modules/spring-data-jpa-crud/src/main/resources/application.properties
index af0df308cd..a11e224a1b 100644
--- a/persistence-modules/spring-data-jpa-crud/src/main/resources/application.properties
+++ b/persistence-modules/spring-data-jpa-crud/src/main/resources/application.properties
@@ -11,4 +11,10 @@ spring.jpa.properties.hibernate.generate_statistics=true
#spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create
#spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=create.sql
#spring.jpa.properties.javax.persistence.schema-generation.scripts.create-source=metadata
-#spring.jpa.properties.hibernate.format_sql=true
\ No newline at end of file
+#spring.jpa.properties.hibernate.format_sql=true
+
+spring.datasource.url=jdbc:mysql://localhost:3306/db_products?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
+spring.datasource.username=root
+spring.datasource.password=root
+
+spring.jpa.hibernate.ddl-auto= update
\ No newline at end of file