diff --git a/MoviesCommon/src/main/java/at.technikumwien.movies/Actors.java b/MoviesCommon/src/main/java/at.technikumwien.movies/Actors.java index 25992db..c79bb7e 100644 --- a/MoviesCommon/src/main/java/at.technikumwien.movies/Actors.java +++ b/MoviesCommon/src/main/java/at.technikumwien.movies/Actors.java @@ -13,14 +13,20 @@ import java.time.LocalDate; @Entity @Table(name = "t_actors") -@NamedQuery( - name = "Actors.getIdByProperties", - query = "SELECT a.id FROM Actors a WHERE " + - "a.firstname LIKE :firstname AND " + - "a.lastname LIKE :lastname AND " + - "a.sex = :sex AND " + - "a.birthdate = :birthdate" -) +@NamedQueries({ + @NamedQuery( + name = "Actors.getIdByProperties", + query = "SELECT a FROM Actors a WHERE " + + "a.firstname LIKE :firstname AND " + + "a.lastname LIKE :lastname AND " + + "a.sex = :sex"// AND " + + //"a.birthdate = :birthdate" + ), + @NamedQuery( + name = "Actors.selectAllActors", + query = "SELECT n FROM Actors n" + ) +}) @XmlRootElement public class Actors { @XmlAttribute(name = "id") @@ -37,7 +43,7 @@ public class Actors { @Column(nullable = false) private Sex sex; - @Column(nullable = false) + //@Column(nullable = false) private LocalDate birthdate; public Actors(String firstname, String lastname, Sex sex, LocalDate birthdate) { diff --git a/MoviesCommon/src/main/java/at.technikumwien.movies/Movies.java b/MoviesCommon/src/main/java/at.technikumwien.movies/Movies.java index 106fe28..1705b08 100644 --- a/MoviesCommon/src/main/java/at.technikumwien.movies/Movies.java +++ b/MoviesCommon/src/main/java/at.technikumwien.movies/Movies.java @@ -5,7 +5,6 @@ import lombok.*; import javax.persistence.*; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; -import java.util.Calendar; import java.util.List; @Data @@ -14,14 +13,17 @@ import java.util.List; @Entity @Table(name = "t_movies") -@NamedQuery( - name = "Movies.selectAll", - query = "SELECT n FROM Movies n" -) -@NamedQuery( - name = "Movies.selectByTitle", - query = "SELECT n FROM Movies n WHERE n.title LIKE :title" -) +@NamedQueries({ + @NamedQuery( + name = "Movies.selectAll", + query = "SELECT n FROM Movies n" + ), + @NamedQuery( + name = "Movies.selectByTitle", + query = "SELECT n FROM Movies n WHERE n.title LIKE :title" + ) +}) + @XmlRootElement public class Movies { // TODO: XmlAttributes may need different names diff --git a/MoviesCommon/src/main/java/at.technikumwien.movies/Studios.java b/MoviesCommon/src/main/java/at.technikumwien.movies/Studios.java index 903324b..16719db 100644 --- a/MoviesCommon/src/main/java/at.technikumwien.movies/Studios.java +++ b/MoviesCommon/src/main/java/at.technikumwien.movies/Studios.java @@ -10,6 +10,19 @@ import javax.persistence.*; @Entity @Table(name = "t_studios") +@NamedQueries({ + @NamedQuery( + name = "Studios.getIdByProperties", + query = "SELECT a FROM Studios a WHERE " + + "a.countrycode LIKE :countrycode AND " + + "a.name LIKE :name AND " + + "a.postcode LIKE :postcode" + ), + @NamedQuery( + name = "Studios.selectAllStudios", + query = "SELECT n FROM Studios n" + ) +}) public class Studios { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/MoviesWebApp/src/main/java/at/technikumwien/movies/MoviesService.java b/MoviesWebApp/src/main/java/at/technikumwien/movies/MoviesService.java index 212d173..d6878e8 100644 --- a/MoviesWebApp/src/main/java/at/technikumwien/movies/MoviesService.java +++ b/MoviesWebApp/src/main/java/at/technikumwien/movies/MoviesService.java @@ -5,11 +5,11 @@ import javax.ejb.*; import javax.persistence.EntityManager; import javax.persistence.EntityNotFoundException; import javax.persistence.PersistenceContext; -import java.sql.ResultSet; import java.util.List; import java.util.logging.Logger; @Stateless +@TransactionManagement(value=TransactionManagementType.CONTAINER) public class MoviesService { private static final Logger LOGGER = Logger.getLogger(MoviesService.class.getName()); @@ -52,18 +52,80 @@ public class MoviesService { em.remove(movies); //managed news required } - public void save(Movies movies) { -// // TODO -// for (Actors actor : movies.getActors()) { -// ResultSet rs = em.createNamedQuery("Actors.getIdByParameters", Actors.class) -// .setParameter() // TODO -// .getResultList(); -// -// // Check if we have a result, if yes -> take first, actor.id = resultID -// // If no result: context.setRollbackOnly(); -// } - LOGGER.info("save() >> movies" + movies); + public List findAllActors() { + LOGGER.info("findAllActors)"); - em.merge(movies); + return em.createNamedQuery("Actors.selectAllActors", Actors.class) + .getResultList(); + } + + public List findAllStudios() { + LOGGER.info("findAllStudios)"); + + return em.createNamedQuery("Studios.selectAllStudios", Studios.class) + .getResultList(); + } + + // TODO maybe check if the movie already exists? + @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) + public void save(Movies movie) { + + // TODO maybe get just the id and improve checking in for loop? + // Get all actors and studios from the database + List allActors = findAllActors(); + List allStudios = findAllStudios(); + + try { + // Get studio for the movie from the database + Studios movieStudio = movie.getStudio(); + + // If the studio is missing in the database, roll back only + for (Studios studio : allStudios) { + if (studio.getName().equals(movieStudio.getName()) & studio.getCountrycode().equals(movieStudio.getCountrycode()) + & studio.getPostcode().equals(movieStudio.getPostcode())) { + // Set id + movieStudio.setId(studio.getId()); + } + } + if (movieStudio.getId() == null) { + LOGGER.info("Rollback! Movie studio: " + movieStudio); + context.setRollbackOnly(); + return; + } + + // TODO use also birthday + // Get actor for the movie from the database + for (Actors movieActor : movie.getActors()) { + LOGGER.info("Get an actor " + movieActor); + List actorListResult = em.createNamedQuery("Actors.getIdByProperties", Actors.class) + .setParameter("firstname", movieActor.getFirstname()) + .setParameter("lastname", movieActor.getLastname()) + .setParameter("sex", movieActor.getSex()) + //.setParameter("birthdate", movieActor.getBirthdate()) + .getResultList(); + + // If any actor is missing in the database, roll back only + for (Actors actor : allActors) { + if (actor.getFirstname().equals(movieActor.getFirstname()) + & actor.getLastname().equals(movieActor.getLastname()) + & actor.getSex().equals(movieActor.getSex())) { + // & actor.getBirthdate().equals(movieActor.getBirthdate())) { + // Set id + movieActor.setId(actor.getId()); + } + if (movieActor.getId() == null) { + LOGGER.info("Rollback! Movie actor: " + movieActor); + context.setRollbackOnly(); + return; + } + } + + LOGGER.info("save() >> movies" + movie); + em.merge(movie); + } + } + catch (Exception e) { + e.printStackTrace(); + } } } \ No newline at end of file diff --git a/MoviesWebApp/src/main/java/at/technikumwien/movies/MoviesServlet.java b/MoviesWebApp/src/main/java/at/technikumwien/movies/MoviesServlet.java index 3b4ac13..7c72347 100644 --- a/MoviesWebApp/src/main/java/at/technikumwien/movies/MoviesServlet.java +++ b/MoviesWebApp/src/main/java/at/technikumwien/movies/MoviesServlet.java @@ -25,8 +25,8 @@ public class MoviesServlet extends HttpServlet { "" + "

Movies

"); - moviesService.findAll().forEach(news -> html.append("

" + news.getTitle() + "

" + - "

" + news.getTitle() + "

")); + moviesService.findAll().forEach(movies -> html.append("

" + movies.getTitle() + "

" + + "

" + movies.getActors() + "

")); html.append("" + "");