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..ef06f77c45 --- /dev/null +++ b/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/Product.java @@ -0,0 +1,68 @@ +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=?") +@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..82d02fa87c --- /dev/null +++ b/persistence-modules/spring-data-jpa-crud/src/main/java/com/baeldung/softdelete/ProductService.java @@ -0,0 +1,35 @@ +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){ + 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..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,10 +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 \ No newline at end of file +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect +