diff --git a/.gitignore b/.gitignore
index 6bc0bfa..ccc6ec9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -81,4 +81,7 @@ fabric.properties
# Sonarlint plugin
.idea/sonarlint
+# Compiled bytecode
+/target/
+
# End of https://www.gitignore.io/api/intellij
diff --git a/.idea/Maven.JPA.EntityManager.iml b/.idea/Maven.JPA.EntityManager.iml
new file mode 100644
index 0000000..0bbc534
--- /dev/null
+++ b/.idea/Maven.JPA.EntityManager.iml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index db06ab1..3fa7bae 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -7,6 +7,7 @@
+
diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml
new file mode 100644
index 0000000..ba2aa47
--- /dev/null
+++ b/.idea/dataSources.xml
@@ -0,0 +1,14 @@
+
+
+
+
+ mysql.8
+ true
+ com.mysql.cj.jdbc.Driver
+ jdbc:mysql://localhost:3306/movies
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 803a716..48b4b95 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,6 +1,9 @@
+
+
+
\ No newline at end of file
diff --git a/src/main/java/entities/Actor.java b/src/main/java/entities/Actor.java
new file mode 100644
index 0000000..6767672
--- /dev/null
+++ b/src/main/java/entities/Actor.java
@@ -0,0 +1,96 @@
+package entities;
+
+
+import com.sun.istack.NotNull;
+
+import javax.persistence.*;
+import java.time.LocalDate;
+import java.util.Set;
+
+@Entity
+//@Table(
+// name = "actor",
+// uniqueConstraints = {@UniqueConstraint(columnNames = {"birthDate", "firstName", "lastName"})}
+//)
+public class Actor
+{
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private Long id;
+ @NotNull
+ private String firstName;
+ @NotNull
+ private String lastName;
+ private String gender;
+ @NotNull
+ private LocalDate birthDate;
+ private String nationality;
+ @ManyToMany(cascade =
+ {CascadeType.PERSIST, CascadeType.MERGE})
+ @JoinTable(
+ name = "movie_cast",
+ joinColumns = {@JoinColumn(name = "actor_id")},
+ inverseJoinColumns = {@JoinColumn(name = "movie_id")}
+ )
+ private Set filmography;
+
+ public Actor()
+ {
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public String getGender() {
+ return gender;
+ }
+
+ public void setGender(String gender) {
+ this.gender = gender;
+ }
+
+ public LocalDate getBirthDate() {
+ return birthDate;
+ }
+
+ public void setBirthDate(LocalDate birthDate) {
+ this.birthDate = birthDate;
+ }
+
+ public String getNationality() {
+ return nationality;
+ }
+
+ public void setNationality(String nationality) {
+ this.nationality = nationality;
+ }
+
+ public Set getFilmography() {
+ return filmography;
+ }
+
+ public void setFilmography(Set filmography) {
+ this.filmography = filmography;
+ }
+}
diff --git a/src/main/java/entities/Movie.java b/src/main/java/entities/Movie.java
new file mode 100644
index 0000000..18d099b
--- /dev/null
+++ b/src/main/java/entities/Movie.java
@@ -0,0 +1,105 @@
+package entities;
+
+
+import com.sun.istack.NotNull;
+
+import javax.persistence.*;
+import java.time.LocalDate;
+import java.util.Objects;
+import java.util.Set;
+
+@Entity
+//@Table(
+// name = "movie",
+// uniqueConstraints = {@UniqueConstraint(columnNames = {"title", "releaseDate"})}
+//)
+public class Movie
+{
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private Long id;
+ @NotNull
+ private String title;
+ @NotNull
+ private LocalDate releaseDate;
+ private String director;
+ @ManyToMany(cascade =
+ {CascadeType.PERSIST, CascadeType.MERGE})
+ @JoinTable(
+ name = "movie_cast",
+ joinColumns = {@JoinColumn(name = "movie_id")},
+ inverseJoinColumns = {@JoinColumn(name = "actor_id")}
+ )
+ private Set cast;
+ String summary;
+
+ public Movie()
+ {
+ }
+
+ public Long getId()
+ {
+ return this.id;
+ }
+
+ public void setId(Long id)
+ {
+ this.id = id;
+ }
+
+ public String getTitle()
+ {
+ return this.title;
+ }
+
+ public void setTitle(String title)
+ {
+ this.title = title;
+ }
+
+ public LocalDate getReleaseDate()
+ {
+ return this.releaseDate;
+ }
+
+ public void setReleaseDate(LocalDate releaseDate)
+ {
+ this.releaseDate = releaseDate;
+ }
+
+ public String getDirector()
+ {
+ return this.director;
+ }
+
+ public void setDirector(String director)
+ {
+ this.director = director;
+ }
+
+ public Set getCast()
+ {
+ return this.cast;
+ }
+
+ public void setCast(Set cast)
+ {
+ this.cast = cast;
+ }
+
+ public String getSummary()
+ {
+ return this.summary;
+ }
+
+ public void setSummary(String summary)
+ {
+ this.summary = summary;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return Objects.hash(this.getTitle());
+ }
+}
diff --git a/src/main/java/services/ActorService.java b/src/main/java/services/ActorService.java
new file mode 100644
index 0000000..2cfec3d
--- /dev/null
+++ b/src/main/java/services/ActorService.java
@@ -0,0 +1,94 @@
+package services;
+
+import entities.Actor;
+import entities.Movie;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+public class ActorService
+{
+ EntityManagerFactory emf;
+ EntityManager em;
+ List actorList;
+
+ public ActorService()
+ {
+ emf = Persistence.createEntityManagerFactory("movieDB");
+ em = emf.createEntityManager();
+ actorList = new ArrayList<>();
+ }
+
+ public List findAll()
+ {
+ return em.createQuery("SELECT a FROM Actor a", Actor.class).getResultList();
+ }
+
+ public Actor findById(Long id)
+ {
+ return em.find(Actor.class, id);
+ }
+
+ public Actor create(Actor actor)
+ {
+ em.getTransaction().begin();
+ em.persist(actor);
+ em.getTransaction().commit();
+
+ return actor;
+ }
+
+ public Actor create(Long id, String firstName, String lastName, String gender, LocalDate birthDate,
+ String nationality, Set filmography)
+ {
+ Actor createdActor = new Actor();
+ createdActor.setId(id);
+ createdActor.setFirstName(firstName);
+ createdActor.setLastName(lastName);
+ createdActor.setGender(gender);
+ createdActor.setBirthDate(birthDate);
+ createdActor.setNationality(nationality);
+ createdActor.setFilmography(filmography);
+ em.getTransaction().begin();
+ em.persist(createdActor);
+ em.getTransaction().commit();
+
+ return createdActor;
+ }
+
+ public void update(Long id, Actor actor)
+ {
+ em.getTransaction().begin();
+ Actor persistentActor = em.find(Actor.class, id);
+ persistentActor.setFirstName(actor.getFirstName());
+ persistentActor.setLastName(actor.getLastName());
+ persistentActor.setGender(actor.getGender());
+ persistentActor.setBirthDate(actor.getBirthDate());
+ persistentActor.setNationality(actor.getNationality());
+ persistentActor.setFilmography(actor.getFilmography());
+ em.getTransaction().commit();
+ }
+
+ public void delete(Long id)
+ {
+ Actor actorToRemove = em.find(Actor.class, id);
+ if(actorToRemove != null)
+ {
+ em.getTransaction().begin();
+ em.remove(actorToRemove);
+ em.getTransaction().commit();
+ }
+ }
+
+ public void delete(Actor actor)
+ {
+ em.getTransaction().begin();
+ em.remove(actor);
+ em.getTransaction().commit();
+ }
+}
diff --git a/src/main/java/services/DELETEME.txt b/src/main/java/services/DELETEME.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/src/main/java/services/MovieService.java b/src/main/java/services/MovieService.java
new file mode 100644
index 0000000..3a6486c
--- /dev/null
+++ b/src/main/java/services/MovieService.java
@@ -0,0 +1,91 @@
+package services;
+
+import entities.Actor;
+import entities.Movie;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+public class MovieService
+{
+ EntityManagerFactory emf;
+ EntityManager em;
+ List movieList;
+
+ public MovieService()
+ {
+ emf = Persistence.createEntityManagerFactory("movieDB");
+ em = emf.createEntityManager();
+ movieList = new ArrayList<>();
+ }
+
+ public List findAll()
+ {
+ return em.createQuery("SELECT m FROM Movie m", Movie.class).getResultList();
+ }
+
+ public Movie findById(Long id)
+ {
+ return em.find(Movie.class, id);
+ }
+
+ public Movie create(Movie movie)
+ {
+ em.getTransaction().begin();
+ em.persist(movie);
+ em.getTransaction().commit();
+
+ return movie;
+ }
+
+ public Movie create(String title, LocalDate releaseDate, String director, Set cast, String summary)
+ {
+ Movie createdMovie = new Movie();
+ createdMovie.setTitle(title);
+ createdMovie.setReleaseDate(releaseDate);
+ createdMovie.setDirector(director);
+ createdMovie.setCast(cast);
+ createdMovie.setSummary(summary);
+ em.getTransaction().begin();
+ em.persist(createdMovie);
+ em.getTransaction().commit();
+
+ return createdMovie;
+ }
+
+ public void update(Long id, Movie movie)
+ {
+ em.getTransaction().begin();
+ Movie persistentMovie = em.find(Movie.class, id);
+ persistentMovie.setTitle(movie.getTitle());
+ persistentMovie.setReleaseDate(movie.getReleaseDate());
+ persistentMovie.setDirector(movie.getDirector());
+ persistentMovie.setCast(movie.getCast());
+ persistentMovie.setSummary(movie.getSummary());
+ em.merge(persistentMovie);
+ em.getTransaction().commit();
+ }
+
+ public void delete(Long id)
+ {
+ Movie movieToRemove = em.find(Movie.class, id);
+ if(movieToRemove != null)
+ {
+ em.getTransaction().begin();
+ em.remove(movieToRemove);
+ em.getTransaction().commit();
+ }
+ }
+
+ public void delete(Movie movie)
+ {
+ em.getTransaction().begin();
+ em.remove(movie);
+ em.getTransaction().commit();
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml
new file mode 100644
index 0000000..68fde66
--- /dev/null
+++ b/src/main/resources/META-INF/persistence.xml
@@ -0,0 +1,22 @@
+
+
+
+ org.hibernate.jpa.HibernatePersistenceProvider
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/java/services/ActorServiceTest.java b/src/test/java/services/ActorServiceTest.java
new file mode 100644
index 0000000..39d7729
--- /dev/null
+++ b/src/test/java/services/ActorServiceTest.java
@@ -0,0 +1,102 @@
+package services;
+
+import entities.Actor;
+import entities.Movie;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.time.LocalDate;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class ActorServiceTest
+{
+ ActorService testActorService;
+ MovieService testMovieService;
+
+ @Before
+ public void init()
+ {
+ testActorService = new ActorService();
+ testMovieService = new MovieService();
+ }
+
+ @Test
+ public void createActorTest()
+ {
+ Actor testActor = new Actor();
+ testActor.setFirstName("Chris");
+ testActor.setLastName("Pine");
+ testActor.setNationality("American");
+ testActor.setBirthDate(LocalDate.of(1980, 8, 26));
+ testActor.setGender("male");
+
+ Movie testMovieA = new Movie();
+ Movie testMovieB = new Movie();
+ testMovieA.setTitle("Star Trek");
+ testMovieB.setTitle("Wonder Woman");
+ Set films = new HashSet<>();
+ films.add(testMovieA);
+ films.add(testMovieB);
+
+ testActor.setFilmography(films);
+
+ testActorService.create(testActor);
+ }
+
+ @Test
+ public void createActorsSameMovie()
+ {
+ Actor testTomHanks = new Actor();
+ testTomHanks.setFirstName("Tom");
+ testTomHanks.setLastName("Hanks");
+ testTomHanks.setBirthDate(LocalDate.of(1967, 3, 21));
+ Actor testMegRyan = new Actor();
+ testMegRyan.setFirstName("Meg");
+ testMegRyan.setLastName("Ryan");
+ testMegRyan.setBirthDate(LocalDate.of(1969, 11, 2));
+ Movie testJoe = new Movie();
+ testJoe.setTitle("Joe Vs. the Volcano");
+ testJoe.setReleaseDate(LocalDate.of(1988, 7, 11));
+ Movie testSleepless = new Movie();
+ testSleepless.setTitle("Sleepless In Seattle");
+ testSleepless.setReleaseDate(LocalDate.of(1992, 11, 20));
+ Movie testMail = new Movie();
+ testMail.setTitle("You've Got Mail");
+ testMail.setReleaseDate(LocalDate.of(1995, 5, 31));
+ Movie testDupeMail = new Movie();
+ testDupeMail.setTitle("You've Got Mail");
+ testDupeMail.setReleaseDate(LocalDate.of(1995, 5, 31));
+
+ Set hanksFilms = new HashSet<>();
+ hanksFilms.add(testJoe);
+ hanksFilms.add(testSleepless);
+ hanksFilms.add(testMail);
+
+ Set ryanFilms = new HashSet<>();
+ ryanFilms.add(testJoe);
+ ryanFilms.add(testSleepless);
+ ryanFilms.add(testDupeMail);
+
+ testTomHanks.setFilmography(hanksFilms);
+ testMegRyan.setFilmography(ryanFilms);
+
+ testActorService.create(testTomHanks);
+ testActorService.create(testMegRyan);
+
+ List movies = testMovieService.findAll();
+
+ for(Movie movie : movies)
+ {
+ System.out.println(movie.getTitle());
+ System.out.println("=======");
+ Set cast = movie.getCast();
+ for(Actor actor : cast)
+ {
+ System.out.println("Actor: " + actor.getFirstName() + " " + actor.getLastName());
+ }
+ System.out.println("\n");
+ }
+ }
+}
diff --git a/src/test/java/services/DELETEME.txt b/src/test/java/services/DELETEME.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/src/test/java/services/MovieServiceTest.java b/src/test/java/services/MovieServiceTest.java
new file mode 100644
index 0000000..3c726c2
--- /dev/null
+++ b/src/test/java/services/MovieServiceTest.java
@@ -0,0 +1,119 @@
+package services;
+
+import entities.Actor;
+import entities.Movie;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import static org.junit.Assert.*;
+
+public class MovieServiceTest
+{
+ MovieService testMovieService;
+
+ @Before
+ public void setup()
+ {
+ testMovieService = new MovieService();
+ }
+
+ @Test
+ public void addMovieTest()
+ {
+ Movie testMovie = new Movie();
+ testMovie.setTitle("The Good, the Bad and the Ugly");
+ testMovie.setDirector("Sergio Leone");
+ testMovie.setReleaseDate(LocalDate.of(1967, 12, 29));
+
+ Actor testActor = new Actor();
+ testActor.setLastName("Eastwood");
+ testActor.setFirstName("Clint");
+
+ Set testCast = new HashSet<>();
+ testCast.add(testActor);
+
+ testMovie.setCast(testCast);
+ testMovie.setSummary("Three rival gungslingers search for lost Confederate gold.");
+
+ testMovieService.create(testMovie);
+ Movie actual = testMovieService.findById(1L);
+
+ assertEquals(testMovie, actual);
+ }
+
+ @Test
+ public void addMovieOtherWayTest()
+ {
+ testMovieService.create("Captain America: The Winter Soldier", LocalDate.of(2014, 4, 10),
+ "Joe Russo", new HashSet(), "Captain America must face off against Hydra in the modern era.");
+ }
+
+ @Test
+ public void findAllMovies()
+ {
+ String expectedTitle = "Short Circuit";
+ Movie firstMovie = new Movie();
+ Movie secondMovie = new Movie();
+ Movie thirdMovie = new Movie();
+ List expected = new ArrayList<>();
+ firstMovie.setTitle("E.T.");
+ firstMovie.setDirector("Steven Spielberg");
+ firstMovie.setSummary("A boy and alien become pals.");
+ firstMovie.setReleaseDate(LocalDate.of(1982, 5, 11));
+ secondMovie.setTitle("Star Wars");
+ thirdMovie.setTitle(expectedTitle);
+
+ expected.add(firstMovie);
+ expected.add(secondMovie);
+ expected.add(thirdMovie);
+
+ testMovieService.create(firstMovie);
+ testMovieService.create(secondMovie);
+ testMovieService.create(thirdMovie);
+
+ List actual = testMovieService.findAll();
+ String actualTitle = actual.get(2).getTitle();
+
+ assertEquals(expected, actual);
+ assertEquals(expectedTitle, actualTitle);
+ }
+
+ @Test
+ public void updateMovieTest()
+ {
+ Movie testMovie = new Movie();
+ String originalTitle = "Toy Story II";
+ testMovie.setTitle(originalTitle);
+ testMovieService.create(testMovie);
+ String actualOriginalTitle = testMovieService.findById(1L).getTitle();
+ assertEquals(originalTitle, actualOriginalTitle);
+
+ String changedTitle = "Toy Story 2";
+ testMovie.setTitle(changedTitle);
+ testMovieService.update(1L, testMovie);
+ String actualChangedTitle = testMovieService.findById(1L).getTitle();
+
+ assertEquals(changedTitle, actualChangedTitle);
+ }
+
+ @Test
+ public void deleteAMovie()
+ {
+ Movie testMovie = new Movie();
+ testMovie.setTitle("Fight Club");
+
+ testMovieService.create(testMovie);
+ List persistentMovies = testMovieService.findAll();
+ assertEquals(true, persistentMovies.contains(testMovie));
+
+ testMovieService.delete(testMovie);
+ persistentMovies = testMovieService.findAll();
+ assertEquals(false, persistentMovies.contains(testMovie));
+ }
+}