diff --git a/layers/pom.xml b/layers/pom.xml index 2027f6ae3..dd036e74c 100644 --- a/layers/pom.xml +++ b/layers/pom.xml @@ -14,7 +14,7 @@ org.springframework.data spring-data-jpa - + org.hibernate hibernate-entitymanager diff --git a/layers/src/main/java/com/iluwatar/layers/App.java b/layers/src/main/java/com/iluwatar/layers/App.java index 67aeb45ac..239674d02 100644 --- a/layers/src/main/java/com/iluwatar/layers/App.java +++ b/layers/src/main/java/com/iluwatar/layers/App.java @@ -1,16 +1,27 @@ package com.iluwatar.layers; +import java.util.Arrays; + public class App { public static void main(String[] args) { CakeBakingService service = new CakeBakingServiceImpl(); - service.saveNewLayer(new CakeLayerInfo("foo", 1)); - service.saveNewLayer(new CakeLayerInfo("bar", 2)); + service.saveNewLayer(new CakeLayerInfo("chocolate", 1200)); + service.saveNewLayer(new CakeLayerInfo("banana", 900)); + service.saveNewLayer(new CakeLayerInfo("strawberry", 950)); service.getAllLayers().stream().forEach((layer) -> System.out.println(layer)); - service.saveNewTopping(new CakeToppingInfo("hoi", 11)); + service.saveNewTopping(new CakeToppingInfo("candies", 350)); service.getAllToppings().stream().forEach((topping) -> System.out.println(topping)); + CakeInfo cakeInfo = new CakeInfo(new CakeToppingInfo("candies", 0), + Arrays.asList(new CakeLayerInfo("chocolate", 0), new CakeLayerInfo("chocolate", 0), + new CakeLayerInfo("chocolate", 0))); + try { + service.bakeNewCake(cakeInfo); + } catch (CakeBakingException e) { + e.printStackTrace(); + } } } diff --git a/layers/src/main/java/com/iluwatar/layers/Cake.java b/layers/src/main/java/com/iluwatar/layers/Cake.java index 8d78d203f..5bdb4ae51 100644 --- a/layers/src/main/java/com/iluwatar/layers/Cake.java +++ b/layers/src/main/java/com/iluwatar/layers/Cake.java @@ -3,6 +3,7 @@ package com.iluwatar.layers; import java.util.ArrayList; import java.util.List; +import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @@ -16,10 +17,10 @@ public class Cake { @GeneratedValue private Long id; - @OneToOne + @OneToOne(cascade = CascadeType.ALL) private CakeTopping topping; - @OneToMany + @OneToMany(cascade = CascadeType.ALL) private List layers; public Cake() { @@ -49,4 +50,8 @@ public class Cake { public void setLayers(List layers) { this.layers = layers; } + + public void addLayer(CakeLayer layer) { + this.layers.add(layer); + } } diff --git a/layers/src/main/java/com/iluwatar/layers/CakeBakingServiceImpl.java b/layers/src/main/java/com/iluwatar/layers/CakeBakingServiceImpl.java index 6bf41c290..419a31d4f 100644 --- a/layers/src/main/java/com/iluwatar/layers/CakeBakingServiceImpl.java +++ b/layers/src/main/java/com/iluwatar/layers/CakeBakingServiceImpl.java @@ -8,7 +8,11 @@ import java.util.stream.Collectors; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +@Service +@Transactional public class CakeBakingServiceImpl implements CakeBakingService { private AbstractApplicationContext context; @@ -22,23 +26,31 @@ public class CakeBakingServiceImpl implements CakeBakingService { List allToppings = getAllToppings(); List matchingToppings = allToppings.stream() .filter((t) -> t.name.equals(cakeInfo.cakeToppingInfo.name)).collect(Collectors.toList()); - if (!matchingToppings.isEmpty()) { -// CakeToppingDao toppingBean = context.getBean(CakeToppingDao.class); -// toppingBean.delete(matchingToppings.iterator().next().id.get()); - } else { + if (matchingToppings.isEmpty()) { throw new CakeBakingException(String.format("Topping %s is not available", cakeInfo.cakeToppingInfo.name)); } - List allLayers = getAllLayers(); + List allLayers = getAllLayerEntities(); + List foundLayers = new ArrayList<>(); for (CakeLayerInfo info: cakeInfo.cakeLayerInfos) { - Optional found = allLayers.stream().filter((layer) -> layer.name.equals(info.name)).findFirst(); - if (found.isPresent()) { -// CakeLayerDao layerBean = context.getBean(CakeLayerDao.class); -// layerBean.delete(found.get().id.get()); - } else { + Optional found = allLayers.stream().filter((layer) -> layer.getName().equals(info.name)).findFirst(); + if (!found.isPresent()) { throw new CakeBakingException(String.format("Layer %s is not available", info.name)); + } else { + foundLayers.add(found.get()); } } + CakeToppingDao toppingBean = context.getBean(CakeToppingDao.class); + CakeTopping topping = toppingBean.findOne(matchingToppings.iterator().next().id.get()); CakeDao cakeBean = context.getBean(CakeDao.class); + Cake cake = new Cake(); + cake = cakeBean.save(cake); + cake.setTopping(topping); + topping.setCake(cake); + cake.setLayers(foundLayers); + for (CakeLayer layer: foundLayers) { + layer.setCake(cake); + } + cakeBean.save(cake); } @Override @@ -53,6 +65,16 @@ public class CakeBakingServiceImpl implements CakeBakingService { bean.save(new CakeLayer(layerInfo.name, layerInfo.calories)); } + private List getAllToppingEntities() { + CakeToppingDao bean = context.getBean(CakeToppingDao.class); + List result = new ArrayList<>(); + Iterator iterator = bean.findAll().iterator(); + while (iterator.hasNext()) { + result.add(iterator.next()); + } + return result; + } + @Override public List getAllToppings() { CakeToppingDao bean = context.getBean(CakeToppingDao.class); @@ -65,6 +87,16 @@ public class CakeBakingServiceImpl implements CakeBakingService { return result; } + private List getAllLayerEntities() { + CakeLayerDao bean = context.getBean(CakeLayerDao.class); + List result = new ArrayList<>(); + Iterator iterator = bean.findAll().iterator(); + while (iterator.hasNext()) { + result.add(iterator.next()); + } + return result; + } + @Override public List getAllLayers() { CakeLayerDao bean = context.getBean(CakeLayerDao.class); diff --git a/layers/src/main/java/com/iluwatar/layers/CakeLayer.java b/layers/src/main/java/com/iluwatar/layers/CakeLayer.java index c547995b3..00101a379 100644 --- a/layers/src/main/java/com/iluwatar/layers/CakeLayer.java +++ b/layers/src/main/java/com/iluwatar/layers/CakeLayer.java @@ -1,8 +1,10 @@ package com.iluwatar.layers; +import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import javax.persistence.ManyToOne; @Entity public class CakeLayer { @@ -14,6 +16,9 @@ public class CakeLayer { private String name; private int calories; + + @ManyToOne(cascade = CascadeType.ALL) + private Cake cake; public CakeLayer() { } @@ -51,4 +56,12 @@ public class CakeLayer { public String toString() { return String.format("name: %s calories: %d", name, calories); } + + public Cake getCake() { + return cake; + } + + public void setCake(Cake cake) { + this.cake = cake; + } } diff --git a/layers/src/main/java/com/iluwatar/layers/CakeLayerInfo.java b/layers/src/main/java/com/iluwatar/layers/CakeLayerInfo.java index 6b2b5b9b4..6b59ebb06 100644 --- a/layers/src/main/java/com/iluwatar/layers/CakeLayerInfo.java +++ b/layers/src/main/java/com/iluwatar/layers/CakeLayerInfo.java @@ -22,6 +22,6 @@ public class CakeLayerInfo { @Override public String toString() { - return String.format("name: %s calories: %d", name, calories); + return String.format("CakeLayerInfo name: %s calories: %d", name, calories); } } diff --git a/layers/src/main/java/com/iluwatar/layers/CakeTopping.java b/layers/src/main/java/com/iluwatar/layers/CakeTopping.java index 38f61efca..5aa861979 100644 --- a/layers/src/main/java/com/iluwatar/layers/CakeTopping.java +++ b/layers/src/main/java/com/iluwatar/layers/CakeTopping.java @@ -1,8 +1,10 @@ package com.iluwatar.layers; +import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import javax.persistence.OneToOne; @Entity public class CakeTopping { @@ -15,6 +17,9 @@ public class CakeTopping { private int calories; + @OneToOne(cascade = CascadeType.ALL) + private Cake cake; + public CakeTopping() { } @@ -51,4 +56,12 @@ public class CakeTopping { public String toString() { return String.format("name: %s calories: %d", name, calories); } + + public Cake getCake() { + return cake; + } + + public void setCake(Cake cake) { + this.cake = cake; + } } diff --git a/layers/src/main/java/com/iluwatar/layers/CakeToppingInfo.java b/layers/src/main/java/com/iluwatar/layers/CakeToppingInfo.java index 7e22f6eb1..829862b3d 100644 --- a/layers/src/main/java/com/iluwatar/layers/CakeToppingInfo.java +++ b/layers/src/main/java/com/iluwatar/layers/CakeToppingInfo.java @@ -22,6 +22,6 @@ public class CakeToppingInfo { @Override public String toString() { - return String.format("name: %s calories: %d", name, calories); + return String.format("CakeToppingInfo name: %s calories: %d", name, calories); } } diff --git a/layers/src/main/resources/applicationContext.xml b/layers/src/main/resources/applicationContext.xml index 3fe15b2f6..3de47a215 100644 --- a/layers/src/main/resources/applicationContext.xml +++ b/layers/src/main/resources/applicationContext.xml @@ -6,10 +6,12 @@ xmlns:jpa="http://www.springframework.org/schema/data/jpa" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd - http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.0.xsd"> + http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> + + @@ -33,6 +35,7 @@ +