From e783f0c74836e733f967cbeb5ec5fceba8472120 Mon Sep 17 00:00:00 2001 From: Hendro Steven Date: Thu, 22 Apr 2021 09:43:02 +0700 Subject: [PATCH 1/3] Adding soft delete --- .../spring-data-jpa-crud/pom.xml | 5 ++ .../java/com/baeldung/softdelete/Product.java | 69 +++++++++++++++++++ .../softdelete/ProductController.java | 34 +++++++++ .../softdelete/ProductRepository.java | 7 ++ .../baeldung/softdelete/ProductService.java | 36 ++++++++++ .../src/main/resources/application.properties | 8 ++- 6 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/Product.java create mode 100644 persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductController.java create mode 100644 persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductRepository.java create mode 100644 persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductService.java 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 From 09eaca991499892267d99062bd0e6a5a9f9b5c00 Mon Sep 17 00:00:00 2001 From: Hendro Steven Date: Thu, 6 May 2021 21:01:54 +0700 Subject: [PATCH 2/3] remove mysql and using h2 db --- persistence-modules/spring-data-jpa-crud/pom.xml | 5 ----- .../src/main/resources/application.properties | 10 ++++++---- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/persistence-modules/spring-data-jpa-crud/pom.xml b/persistence-modules/spring-data-jpa-crud/pom.xml index 4afb75d737..16ee74aa62 100644 --- a/persistence-modules/spring-data-jpa-crud/pom.xml +++ b/persistence-modules/spring-data-jpa-crud/pom.xml @@ -33,11 +33,6 @@ com.h2database h2 - - mysql - mysql-connector-java - runtime - net.ttddyy datasource-proxy 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 a11e224a1b..a3a7bd42f7 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 @@ -13,8 +13,10 @@ spring.jpa.properties.hibernate.generate_statistics=true #spring.jpa.properties.javax.persistence.schema-generation.scripts.create-source=metadata #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.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 +# spring.jpa.hibernate.ddl-auto= update + +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect \ No newline at end of file From 567a71fdbcebdf00a3d700060c6571598cc9da5b Mon Sep 17 00:00:00 2001 From: Hendro Steven Date: Thu, 13 May 2021 19:13:06 +0700 Subject: [PATCH 3/3] remove comments --- .../java/com/baeldung/softdelete/Product.java | 1 - .../com/baeldung/softdelete/ProductService.java | 1 - .../src/main/resources/application.properties | 15 +-------------- 3 files changed, 1 insertion(+), 16 deletions(-) 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 index 543252e474..ef06f77c45 100644 --- 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 @@ -17,7 +17,6 @@ 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 { 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 index 2bced0c4d8..82d02fa87c 100644 --- 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 @@ -25,7 +25,6 @@ public class ProductService { } public Iterable findAll(boolean isDeleted){ - //return productRepository.findAll(); Session session = entityManager.unwrap(Session.class); Filter filter = session.enableFilter("deletedProductFilter"); filter.setParameter("isDeleted", isDeleted); 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 a3a7bd42f7..18ef8d4e60 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 @@ -5,18 +5,5 @@ spring.jpa.properties.hibernate.order_inserts=true spring.jpa.properties.hibernate.order_updates=true spring.jpa.properties.hibernate.generate_statistics=true -# JPA-Schema-Generation -# Use below configuration to generate database schema create commands based on the entity models -# and export them into the create.sql file -#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 +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect -# 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 - -spring.jpa.database-platform=org.hibernate.dialect.H2Dialect \ No newline at end of file