Третья лабораторная работа. Создана сущность CountProduct для подсчета товаров в корзине вместо обозначения связи многие ко многим через collectionTable.

This commit is contained in:
ksenianeva 2023-05-15 22:04:25 +04:00
parent 69897fcfa4
commit b4574b49d9
8 changed files with 210 additions and 101 deletions

View File

@ -17,9 +17,10 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'com.h2database:h2:2.1.210'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation group: 'org.springdoc', name: 'springdoc-openapi-ui', version: '1.6.5'
implementation 'org.hibernate.validator:hibernate-validator'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

Binary file not shown.

View File

@ -1,7 +1,6 @@
package com.example.lab.DataBaseLab3.Models;
import jakarta.persistence.*;
import jakarta.persistence.criteria.CriteriaBuilder;
import java.util.*;
@ -12,79 +11,37 @@ public class Cart {
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToMany
private List<CountProduct> countProducts;
@OneToOne
private Customer customer;
@ManyToMany(fetch = FetchType.EAGER, mappedBy = "carts", cascade = CascadeType.ALL )
private List<Product> products; //can't count there because of "integer not @entity"
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "cart_products_count",
joinColumns = {@JoinColumn(name = "cart_id", referencedColumnName = "id")})
@MapKeyColumn(name = "product")
@Column(name = "amount")
private Map<Product, Integer> countProducts; //count amount of products
public Cart(){}
public Cart(Customer customer) {
this.countProducts = new HashMap<>();
this.countProducts = new ArrayList<>();
this.customer = customer;
}
public List<Product> getProducts() {
return products;
}
public Map<Product,Integer> getCountProducts(){
return countProducts;
}
//изменяет ее значение если есть такой товар на +1
public void addProduct(Product product){
if(!countProducts.containsKey(product) || !products.contains(product)){
this.countProducts.put(product, 1);
this.products.add(product);
}
else{
countProducts.put(product, countProducts.get(product) + 1);
}
if (!product.getCarts().contains(this)){
product.addCart(this);
}
}
public void deleteProduct(Product product){
products.remove(product);
if (product.getCarts().contains(this)) {
product.removeCart(this);
}
countProducts.remove(product);
}
public void reduceProduct(Product product){
if (!countProducts.containsKey(product)) return;
if(countProducts.get(product)==1){
//delete the last one
deleteProduct(product);
}
else{
countProducts.put(product, countProducts.get(product) - 1);
}
}
@PreRemove
public void deleteThis(){
deleteAllProducts();
//deleteAllProducts();
this.getCustomer().setCart(null);
}
public void deleteAllProducts(){
ArrayList<Product> products = new ArrayList<>(this.products);
this.countProducts.clear();
this.products.clear();
for (var product:
products) {
if (product.getCarts().contains(this)) product.removeCart(this);
public void addCountProduct(CountProduct countProduct){
countProducts.add(countProduct);
if (countProduct.getCart() != this) {
countProduct.setCart(this);
}
}
public void deleteCountProduct(CountProduct countProduct){
countProducts.remove(countProduct);
if (countProduct.getCart() == this) {
countProduct.setCart(null);
}
}

View File

@ -0,0 +1,87 @@
package com.example.lab.DataBaseLab3.Models;
import jakarta.persistence.*;
import java.util.*;
@Entity
public class CountProduct {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column
private Integer amount;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="cart_fk")
private Cart cart;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="product_fk")
private Product product;
public CountProduct(){}
public CountProduct(Cart cart, Product product) {
this.cart = cart;
this.product = product;
this.amount = 0;
this.cart.addCountProduct(this);
this.product.addCountProduct(this);
}
public void setProduct(Product product) {
this.product = product;
if (product != null && !product.getCountProducts().contains(this)){
product.addCountProduct(this);
}
}
public Cart getCart() {
return cart;
}
public void setCart(Cart cart) {
this.cart = cart;
}
public Product getProduct() {
return product;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
public void incrementAmount(){
this.amount++;
}
public void decrementAmount(){
this.amount--;
}
@PreRemove
public void deleteThis(){
if(this.product !=null) this.product.deleteCountProduct(this);
if(this.cart !=null) this.cart.deleteCountProduct(this);
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
CountProduct countProducts = (CountProduct) obj;
return Objects.equals(id, countProducts.id);
}
@Override
public int hashCode(){
return Objects.hashCode(id);
}
}

View File

@ -3,7 +3,6 @@ package com.example.lab.DataBaseLab3.Models;
import jakarta.persistence.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;
@ -15,12 +14,9 @@ public class Product {
private String name;
private float price;
@OneToMany
private List<CountProduct> countProducts;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "products_carts",
joinColumns = @JoinColumn(name = "product_fk"),
inverseJoinColumns = @JoinColumn(name = "cart_fk"))
private List<Cart> carts;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "productCategory_fk")
private ProductCategory productCategory;
@ -31,6 +27,7 @@ public class Product {
this.name = name;
this.price = price;
this.productCategory = productCategory;
this.countProducts = new ArrayList<>();
}
public ProductCategory getProductCategory() {
@ -67,40 +64,31 @@ public class Product {
return price;
}
public void addCart(Cart cart) {
carts.add(cart);
if (!cart.getProducts().contains(this)) {
cart.addProduct(this);
}
}
@PreRemove
public void deleteThis(){
deleteAllCarts();
//deleteAllCarts();
this.productCategory.getProducts().remove(this);
}
public void deleteAllCarts(){
ArrayList<Cart> carts = new ArrayList<>(this.carts);
this.carts.clear();
for (var cart:
carts) {
cart.deleteProduct(this);
public List<CountProduct> getCountProducts(){
return countProducts;
}
public void addCountProduct(CountProduct countProduct){
countProducts.add(countProduct);
if (countProduct.getProduct() != this) {
countProduct.setProduct(this);
}
}
public void removeCart(Cart cart) {
carts.remove(cart);
if (cart.getProducts().contains(this)) {
cart.deleteAllProducts();
public void deleteCountProduct(CountProduct countProduct){
countProducts.remove(countProduct);
if (countProduct.getProduct() == this) {
countProduct.setProduct(null);
}
}
public List<Cart> getCarts() {
return carts;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;

View File

@ -2,10 +2,10 @@ package com.example.lab.DataBaseLab3.Services;
import com.example.lab.DataBaseLab3.Models.Customer;
import com.example.lab.DataBaseLab3.Models.Product;
import com.example.lab.DataBaseLab3.Models.CountProduct;
import jakarta.persistence.*;
import jakarta.transaction.Transactional;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import com.example.lab.DataBaseLab3.Models.Cart;
import java.util.List;
@ -15,9 +15,11 @@ public class CartService {
private EntityManager em;
private final ProductService productService;
private final CountProductService countProductService;
public CartService(ProductService productService){
public CartService(ProductService productService, CountProductService countProductService){
this.productService = productService;
this.countProductService = countProductService;
}
@Transactional
@ -61,7 +63,9 @@ public class CartService {
public Product addProduct(Long cartId, Long productId){
Product product = productService.getProduct(productId);
Cart cart = getCart(cartId);
cart.addProduct(product);
var countProduct = countProductService.getCountProduct(productId, cartId);
if(countProduct == null) countProduct = countProductService.addCountProduct(product, cart);
countProduct.incrementAmount();
em.persist(cart);
return product;
}
@ -70,7 +74,9 @@ public class CartService {
public Product deleteProduct(Long cartId, Long productId){
Product product = productService.getProduct(productId);
Cart cart = getCart(cartId);
cart.deleteProduct(product);
var countProduct = countProductService.getCountProduct(productId, cartId);
if(countProduct == null) return null;
countProductService.deleteCountProduct(productId,cartId);
em.persist(cart);
return product;
}
@ -79,7 +85,10 @@ public class CartService {
public Product reduceProduct(Long cartId, Long productId){
Product product = productService.getProduct(productId);
Cart cart = getCart(cartId);
cart.reduceProduct(product);
var countProduct = countProductService.getCountProduct(productId, cartId);
if(countProduct == null) return null;
countProduct.decrementAmount();
em.persist(countProduct);
return product;
}
}

View File

@ -0,0 +1,68 @@
package com.example.lab.DataBaseLab3.Services;
import com.example.lab.DataBaseLab3.Models.*;
import jakarta.persistence.*;
import jakarta.transaction.Transactional;
import org.springframework.stereotype.Service;
import com.example.lab.DataBaseLab3.Models.Product;
import java.util.List;
@Service
public class CountProductService {
@PersistenceContext
private EntityManager em;
@Transactional
public CountProduct addCountProduct(Product product,
Cart cart){
CountProduct countProduct = new CountProduct(cart, product);
em.persist(countProduct);
return countProduct;
}
@Transactional
public CountProduct getCountProduct(long productId, long cartId){
var count = getAllCountProducts();
var countProduct = count.stream().filter(x -> x.getProduct().getId() == productId
&& x.getCart().getId() == cartId ).findFirst();
if(countProduct.isEmpty()) return null;
else return countProduct.get();
}
@Transactional
public CountProduct incrementProduct (long productId, long cartId){
CountProduct countProduct = getCountProduct(productId, cartId);
countProduct.incrementAmount();
return em.merge(countProduct);
}
@Transactional
public CountProduct decrementProduct (long productId, long cartId){
CountProduct countProduct = getCountProduct(productId, cartId);
countProduct.decrementAmount();
return em.merge(countProduct);
}
@Transactional
public CountProduct deleteCountProduct(long productId, long cartId){
final CountProduct countProduct = getCountProduct(productId, cartId);
em.remove(countProduct);
return countProduct;
}
@Transactional
public void deleteAll(){
var list = getAllCountProducts();
for (var cp:
list) {
cp.deleteThis();
em.remove(cp);
}
}
@Transactional
public List<CountProduct> getAllCountProducts(){
return em.createQuery("from CountProduct", CountProduct.class).getResultList();
}
}

View File

@ -1,13 +1,11 @@
package com.example.lab;
import com.example.lab.DataBaseLab3.Models.Cart;
import com.example.lab.DataBaseLab3.Models.Customer;
import com.example.lab.DataBaseLab3.Models.Product;
import com.example.lab.DataBaseLab3.Models.ProductCategory;
import com.example.lab.DataBaseLab3.Models.*;
import com.example.lab.DataBaseLab3.Services.CartService;
import com.example.lab.DataBaseLab3.Services.CustomerService;
import com.example.lab.DataBaseLab3.Services.ProductCategoryService;
import com.example.lab.DataBaseLab3.Services.ProductService;
import com.example.lab.DataBaseLab3.Services.CountProductService;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
@ -23,6 +21,9 @@ public class DBTests {
ProductCategoryService productCategoryService;
@Autowired
ProductService productService;
@Autowired
CountProductService countProductService;
@Test
void testProductCategory(){
@ -63,10 +64,8 @@ public class DBTests {
@Test
void testCustomer(){
cleanAll();
Customer customer = customerService.addCustomer("Ivan",
"Ivanov", "cityExample");
Cart cart = cartService.addCart(customer);
Assertions.assertEquals("Ivan", customerService
.getCustomer(customer.getId()).getFirstName());
Assertions.assertEquals("Ivanov", customerService
@ -101,7 +100,6 @@ public class DBTests {
Cart cart = cartService.addCart(customer);
Assertions.assertEquals(product,cartService.addProduct(cart.getId(), product.getId()));
Assertions.assertEquals(cart,cartService.getCart(cart.getId()));
Assertions.assertEquals(product, cartService.reduceProduct(cart.getId(),product.getId()));
Assertions.assertEquals(product, cartService.deleteProduct(cart.getId(),product.getId()));
@ -110,6 +108,7 @@ public class DBTests {
}
public void cleanAll(){
countProductService.deleteAll();
productService.deleteAllProducts();
cartService.deleteAllCarts();
customerService.deleteAllCustomers();