From 7c0cb4150d7c7ac2969335a6550464f205d6468e Mon Sep 17 00:00:00 2001 From: Barbara Date: Thu, 28 Nov 2019 19:24:14 +0100 Subject: [PATCH 1/3] Added checking by import of movies, if actors and studio are already in the database. Birthday needs to be add for checking. Maybe check if movie already exists? All or none principle needs checking --- .../java/at.technikumwien.movies/Actors.java | 24 +++-- .../java/at.technikumwien.movies/Movies.java | 20 +++-- .../java/at.technikumwien.movies/Studios.java | 13 +++ .../technikumwien/movies/MoviesService.java | 88 ++++++++++++++++--- .../technikumwien/movies/MoviesServlet.java | 4 +- 5 files changed, 116 insertions(+), 33 deletions(-) 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("" + ""); From 5cbece42bb1ef7df44ff9a277da0be5636380140 Mon Sep 17 00:00:00 2001 From: Barbara Date: Thu, 28 Nov 2019 19:43:07 +0100 Subject: [PATCH 2/3] Implemented all or none principle for the save method --- .idea/encodings.xml | 4 + .../technikumwien/movies/MoviesService.java | 100 +++++++++--------- .../movies/MoviesWebServiceImpl.java | 4 +- 3 files changed, 57 insertions(+), 51 deletions(-) diff --git a/.idea/encodings.xml b/.idea/encodings.xml index d63dcda..9ca34f0 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -3,7 +3,11 @@ + + + + \ No newline at end of file diff --git a/MoviesWebApp/src/main/java/at/technikumwien/movies/MoviesService.java b/MoviesWebApp/src/main/java/at/technikumwien/movies/MoviesService.java index d6878e8..f562a1f 100644 --- a/MoviesWebApp/src/main/java/at/technikumwien/movies/MoviesService.java +++ b/MoviesWebApp/src/main/java/at/technikumwien/movies/MoviesService.java @@ -68,64 +68,68 @@ public class MoviesService { // TODO maybe check if the movie already exists? @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) - public void save(Movies movie) { + public void save(List movies) { - // 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(); + for (Movies movie : movies) { - try { - // Get studio for the movie from the database - Studios movieStudio = movie.getStudio(); + // 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(); - // 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; - } + try { + // Get studio for the movie from the database + Studios movieStudio = movie.getStudio(); - // 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())) { + // 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 - movieActor.setId(actor.getId()); - } - if (movieActor.getId() == null) { - LOGGER.info("Rollback! Movie actor: " + movieActor); - context.setRollbackOnly(); - return; + movieStudio.setId(studio.getId()); } } + if (movieStudio.getId() == null) { + LOGGER.info("Rollback! Movie studio: " + movieStudio); + context.setRollbackOnly(); + return; + } - LOGGER.info("save() >> movies" + movie); - em.merge(movie); + // 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; + } + } + } + } + catch (Exception e) { + e.printStackTrace(); } } - catch (Exception e) { - e.printStackTrace(); + LOGGER.info("save() >> movies" + movies); + for (Movies movie : movies) { + em.merge(movie); } } } \ No newline at end of file diff --git a/MoviesWebApp/src/main/java/at/technikumwien/movies/MoviesWebServiceImpl.java b/MoviesWebApp/src/main/java/at/technikumwien/movies/MoviesWebServiceImpl.java index f2cc611..7f4622f 100644 --- a/MoviesWebApp/src/main/java/at/technikumwien/movies/MoviesWebServiceImpl.java +++ b/MoviesWebApp/src/main/java/at/technikumwien/movies/MoviesWebServiceImpl.java @@ -28,8 +28,6 @@ public class MoviesWebServiceImpl implements MoviesWebService { @Override public void importMovies(List movies) { - for (Movies movie : movies) { - moviesService.save(movie); - } + moviesService.save(movies); } } From 73c0945c4acdcb00e28797a0a26d226dd24e57ae Mon Sep 17 00:00:00 2001 From: Barbara Date: Thu, 28 Nov 2019 20:14:04 +0100 Subject: [PATCH 3/3] Used NamedQueries in the save method --- .../technikumwien/movies/MoviesService.java | 47 ++++++++----------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/MoviesWebApp/src/main/java/at/technikumwien/movies/MoviesService.java b/MoviesWebApp/src/main/java/at/technikumwien/movies/MoviesService.java index f562a1f..a30cb06 100644 --- a/MoviesWebApp/src/main/java/at/technikumwien/movies/MoviesService.java +++ b/MoviesWebApp/src/main/java/at/technikumwien/movies/MoviesService.java @@ -72,24 +72,22 @@ public class MoviesService { for (Movies movie : movies) { - // 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(); + LOGGER.info("Get a studio" + movieStudio); + List studioListResult = em.createNamedQuery("Studios.getIdByProperties", Studios.class) + .setParameter("name", movieStudio.getName()) + .setParameter("countrycode", movieStudio.getCountrycode()) + .setParameter("postcode", movieStudio.getPostcode()) + .getResultList(); - // 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 (!studioListResult.isEmpty() && studioListResult.size() > 0) { + Long actorId = studioListResult.get(0).getId(); + movieStudio.setId(actorId); } - if (movieStudio.getId() == null) { + else + { LOGGER.info("Rollback! Movie studio: " + movieStudio); context.setRollbackOnly(); return; @@ -99,27 +97,22 @@ public class MoviesService { // 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) + 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 (!actorListResult.isEmpty() && actorListResult.size() > 0) { + Long actorId = actorListResult.get(0).getId(); + movieActor.setId(actorId); } - if (movieActor.getId() == null) { - LOGGER.info("Rollback! Movie actor: " + movieActor); - context.setRollbackOnly(); - return; - } + else + { + LOGGER.info("Rollback! Movie actor: " + movieActor); + context.setRollbackOnly(); + return; } } }