diff --git a/src/main/java/ru/ulstu/is/sbapp/client/model/Client.java b/src/main/java/ru/ulstu/is/sbapp/client/model/Client.java index d949983..e53eef3 100644 --- a/src/main/java/ru/ulstu/is/sbapp/client/model/Client.java +++ b/src/main/java/ru/ulstu/is/sbapp/client/model/Client.java @@ -27,13 +27,13 @@ public class Client { this.lastName = lastName; this.purchases = new ArrayList<>(); } - public void addPurchase(Purchase purchase) - { - this.purchases.add(purchase); - if(purchase.getClient() != this) + + public void setPurchase(Purchase purchase) { + if(purchase==null) { - purchase.setClient(this); + throw new IllegalArgumentException("Да"); } + this.purchases.add(purchase); } public Long getId() { diff --git a/src/main/java/ru/ulstu/is/sbapp/client/service/ClientService.java b/src/main/java/ru/ulstu/is/sbapp/client/service/ClientService.java index c519cf2..e8299ff 100644 --- a/src/main/java/ru/ulstu/is/sbapp/client/service/ClientService.java +++ b/src/main/java/ru/ulstu/is/sbapp/client/service/ClientService.java @@ -32,14 +32,7 @@ public class ClientService { em.persist(client); return client; } - @Transactional - public Client addPurchase(Long id, Date DateOfPurchase,double price) - { - final Client curclient = findClient(id); - final Purchase purchase=purchaseService.addPurchase(DateOfPurchase,price); - curclient.addPurchase(purchase); - return em.merge(curclient); - } + @Transactional(readOnly = true) public Client findClient(Long id) { final Client client = em.find(Client.class, id); diff --git a/src/main/java/ru/ulstu/is/sbapp/purchase/model/Purchase.java b/src/main/java/ru/ulstu/is/sbapp/purchase/model/Purchase.java index de45d19..883fd23 100644 --- a/src/main/java/ru/ulstu/is/sbapp/purchase/model/Purchase.java +++ b/src/main/java/ru/ulstu/is/sbapp/purchase/model/Purchase.java @@ -24,7 +24,7 @@ public class Purchase { @JoinColumn(name ="client_fk") private Client client; - @ManyToMany + @ManyToMany(fetch = FetchType.EAGER) @JoinTable(name = "purchases_techniques", joinColumns = @JoinColumn(name = "purchase_fk"), inverseJoinColumns = @JoinColumn(name = "technique_fk")) @@ -44,13 +44,13 @@ public class Purchase { public List getTechnique() { return techniques; } - public void setTechnique(Technique technique) { + public void addTechnique(Technique technique) { if (techniques == null){ techniques = new ArrayList<>(); } this.techniques.add(technique); - if (!technique.getPurchases().contains(this)) { // warning this may cause performance issues if you have a large data set since this operation is O(n) - technique.getPurchases().add(this); + if (technique.getPurchase()==null) { // warning this may cause performance issues if you have a large data set since this operation is O(n) + technique.setPurchase(this); } } public Long getId() @@ -79,6 +79,9 @@ public class Purchase { } public void setClient(Client client) { + if(this.client != null){ + this.client.getPurchases().remove(this); + } this.client=client; if (!client.getPurchases().contains(this)) { client.getPurchases().add(this); diff --git a/src/main/java/ru/ulstu/is/sbapp/purchase/service/PurchaseService.java b/src/main/java/ru/ulstu/is/sbapp/purchase/service/PurchaseService.java index 20655a8..cfb7766 100644 --- a/src/main/java/ru/ulstu/is/sbapp/purchase/service/PurchaseService.java +++ b/src/main/java/ru/ulstu/is/sbapp/purchase/service/PurchaseService.java @@ -10,6 +10,7 @@ import jakarta.persistence.EntityManager; import jakarta.persistence.EntityNotFoundException; import jakarta.persistence.PersistenceContext; import ru.ulstu.is.sbapp.purchase.model.Purchase; +import ru.ulstu.is.sbapp.technique.model.Technique; import java.util.Date; import java.util.List; @@ -20,7 +21,7 @@ public class PurchaseService { private EntityManager em; @Transactional - public Purchase addPurchase(Date DateOfPurchase, double Price) { + public Purchase addPurchase(Date DateOfPurchase, double Price, List techniques) { if (DateOfPurchase==null) { throw new IllegalArgumentException("Date of purchase is null or empty"); } @@ -28,6 +29,9 @@ public class PurchaseService { throw new IllegalArgumentException("Price is null or empty"); } final Purchase purchase = new Purchase(DateOfPurchase, Price); + for (int i = 0; i < techniques .size(); i++){ + purchase.addTechnique(techniques.get(i)); + } em.persist(purchase); return purchase; } diff --git a/src/main/java/ru/ulstu/is/sbapp/technique/model/Technique.java b/src/main/java/ru/ulstu/is/sbapp/technique/model/Technique.java index d8270a0..455e7e7 100644 --- a/src/main/java/ru/ulstu/is/sbapp/technique/model/Technique.java +++ b/src/main/java/ru/ulstu/is/sbapp/technique/model/Technique.java @@ -3,6 +3,7 @@ package ru.ulstu.is.sbapp.technique.model; import jakarta.persistence.*; import ru.ulstu.is.sbapp.purchase.model.Purchase; +import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -19,7 +20,7 @@ public class Technique { - @ManyToMany(mappedBy = "techniques") + @ManyToMany(mappedBy = "techniques",fetch = FetchType.EAGER) private List purchases; public Technique(){} @@ -48,10 +49,19 @@ public class Technique { { this.TechPrice=TechPrice; } - public List getPurchases() + public List getPurchase() { return purchases; } + public void setPurchase(Purchase purchase) { + if (purchases == null){ + purchases = new ArrayList<>(); + } + this.purchases.add(purchase); + if (!purchase.getTechnique().contains(this)) { // warning this may cause performance issues if you have a large data set since this operation is O(n) + purchase.getTechnique().add(this); + } + } @Override public boolean equals(Object o) { if (this == o) return true; @@ -64,4 +74,13 @@ public class Technique { public int hashCode() { return Objects.hash(id); } + + @Override + public String toString() { + return "Technique{" + + "id=" + id + + ", Type='" + Type + '\'' + + ", TechPrice ='" + TechPrice + '\'' + + '}'; + } } diff --git a/src/test/java/ru/ulstu/is/sbapp/TechShopTest.java b/src/test/java/ru/ulstu/is/sbapp/TechShopTest.java index 81597b8..b7fc338 100644 --- a/src/test/java/ru/ulstu/is/sbapp/TechShopTest.java +++ b/src/test/java/ru/ulstu/is/sbapp/TechShopTest.java @@ -1,5 +1,6 @@ package ru.ulstu.is.sbapp; +import jakarta.persistence.EntityNotFoundException; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -8,6 +9,7 @@ import ru.ulstu.is.sbapp.client.model.Client; import ru.ulstu.is.sbapp.client.service.ClientService; import ru.ulstu.is.sbapp.purchase.model.Purchase; import ru.ulstu.is.sbapp.purchase.service.PurchaseService; +import ru.ulstu.is.sbapp.technique.model.Technique; import ru.ulstu.is.sbapp.technique.service.TechniqueService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -36,19 +38,34 @@ public class TechShopTest { Assertions.assertNotNull(client.getId()); } + @Test void testPurchaseCreate() { purchaseService.deleteAllPurchases(); - clientService.deleteAllClients(); - final Client client = clientService.addClient("Вася","Пупкин"); - Date date = new Date(12121212L); - clientService.addPurchase(client.getId(),date, 3000.0); - log.info(client.getPurchases().toString()); + techniqueService.deleteAllTechniques(); + final Technique tech1 = techniqueService.addTechnique("Computer",200000.0); + final Technique tech2 = techniqueService.addTechnique("Mobile phone",10000.0); + final Technique tech3 = techniqueService.addTechnique("Microwave",45000.0); + ArrayList techniques=new ArrayList<>(); + techniques.add(tech1); + techniques.add(tech2); + techniques.add(tech3); + Date date = new Date(1212121212121L); + final Purchase purchase= purchaseService.addPurchase(date,1,techniques); + log.info(purchase.toString()); + final Purchase purchase1 = purchaseService.findPurchase(purchase.getId()); + Assertions.assertEquals(true,purchase1.getTechnique().contains(tech1)); + Assertions.assertEquals(purchase,purchase1); + log.info(purchase.getTechnique().toString()); + + Assertions.assertEquals(purchase1.getTechnique().size(), 3); + + + purchaseService.deleteAllPurchases(); + Assertions.assertThrows(EntityNotFoundException.class, () -> purchaseService.findPurchase(-1L)); } - @Test - void testTecnhiques(){} @Test void testPurchases(){}