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 @@