diff --git a/src/main/java/guru/springframework/spring5webapp/bootstrap/BootstrapData.java b/src/main/java/guru/springframework/spring5webapp/bootstrap/BootstrapData.java new file mode 100644 index 0000000000..5babeab72c --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/bootstrap/BootstrapData.java @@ -0,0 +1,195 @@ +package guru.springframework.spring5webapp.bootstrap; +import guru.springframework.spring5webapp.domain.Director; +import guru.springframework.spring5webapp.domain.Movie; +import guru.springframework.spring5webapp.domain.Studio; +import guru.springframework.spring5webapp.repositories.DirectorRepository; +import guru.springframework.spring5webapp.repositories.MovieRepository; +import guru.springframework.spring5webapp.repositories.StudioRepository; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component +public class BootstrapData implements CommandLineRunner { //confused by syntax + private final DirectorRepository directorRepository; + private final MovieRepository movieRepository; + private final StudioRepository studioRepository; + + public BootstrapData(DirectorRepository directorRepository, MovieRepository movieRepository, StudioRepository studioRepository) { + this.directorRepository = directorRepository; + this.movieRepository = movieRepository; + this.studioRepository = studioRepository; + } + + @Override //confused by @Override need + public void run(String... args) throws Exception { + + System.out.println("Started in Bootstrap"); + + Studio cp = new Studio(); + cp.setName("Columbia Pictures"); + cp.setCity("Culver City"); + cp.setState("California"); + studioRepository.save(cp); + + Studio ap = new Studio(); + ap.setName("Annapurna Pictures"); + ap.setCity("Los Angeles"); + ap.setState("California"); + studioRepository.save(ap); + + Studio pp = new Studio(); + pp.setName("Paramount Pictures"); + pp.setCity("Hollywood"); + pp.setState("California"); + studioRepository.save(pp); + + Studio up = new Studio(); + up.setName("Universal Pictures"); + up.setCity("Universal City"); + up.setState("California"); + studioRepository.save(up); + + Studio wb = new Studio(); + wb.setName("Warner Bros"); + wb.setCity("Burbank"); + wb.setState("California"); + studioRepository.save(wb); + + Studio wds = new Studio(); + wds.setName("Walt Disney Studios"); + wds.setCity("Burbank"); + wds.setState("California"); + studioRepository.save(wds); + + Studio sp = new Studio(); + sp.setName("Sony Pictures"); + sp.setCity("Culver City"); + sp.setState("California"); + studioRepository.save(sp); + +//Christopher Nolan Movies + Director cNolan = new Director("Christopher","Nolan"); + directorRepository.save(cNolan); + Movie inters = new Movie("Interstellar", 2014, 8.7); + inters.setStudio(cp); + inters.getDirectors().add(cNolan); + cNolan.getMovies().add(inters); + cp.getMovies().add(inters); + movieRepository.save(inters); + + Movie incep = new Movie("Inception", 2010, 8.8); + incep.setStudio(wb); + incep.getDirectors().add(cNolan); + cNolan.getMovies().add(incep); + wb.getMovies().add(incep); + movieRepository.save(incep); + + Movie oppen = new Movie("Oppenheimer", 2023, 8.3); + oppen.setStudio(up); + oppen.getDirectors().add(cNolan); + cNolan.getMovies().add(oppen); + up.getMovies().add(oppen); + movieRepository.save(oppen); + + + Movie darkk = new Movie("Dark Knight", 2008, 9.0); + darkk.setStudio(wb); + darkk.getDirectors().add(cNolan); + cNolan.getMovies().add(darkk); + wb.getMovies().add(darkk); + movieRepository.save(darkk); + +//Adam McKay Movies + Director aMckay = new Director("Adam", "McKay"); + directorRepository.save(aMckay); + Movie stepb = new Movie("Step Brothers", 2008, 6.9); + stepb.setStudio(sp); + stepb.getDirectors().add(aMckay); + aMckay.getMovies().add(stepb); + sp.getMovies().add(stepb); + movieRepository.save(stepb); + + Movie talla = new Movie("Talladega Nights: The Ballad of Ricky Bobby", 2006, 6.6); + talla.setStudio(cp); + talla.getDirectors().add(aMckay); + aMckay.getMovies().add(talla); + cp.getMovies().add(talla); + movieRepository.save(talla); + + Movie otherg = new Movie("The Other Guys", 2010, 6.6); + otherg.setStudio(cp); + otherg.getDirectors().add(aMckay); + aMckay.getMovies().add(otherg); + cp.getMovies().add(otherg); + movieRepository.save(otherg); + + Movie vice = new Movie("Vice", 2018, 7.2); + vice.setStudio(ap); + vice.getDirectors().add(aMckay); + aMckay.getMovies().add(vice); + ap.getMovies().add(vice); + movieRepository.save(vice); + + Movie ancho = new Movie("Anchorman: The Legend of Ron Burgundy", 2004, 7.1); + ancho.setStudio(pp); + ancho.getDirectors().add(aMckay); + aMckay.getMovies().add(ancho); + pp.getMovies().add(ancho); + movieRepository.save(ancho); + +//Martin Scorsese Movies + Director mScorsese = new Director("Martin", "Scorsese"); + directorRepository.save(mScorsese); + Movie depar = new Movie("The Departed", 2006, 8.5); + depar.setStudio(wb); + depar.getDirectors().add(mScorsese); + mScorsese.getMovies().add(depar); + wb.getMovies().add(depar); + movieRepository.save(depar); + + Movie shutte = new Movie("Shutter Island", 2010, 8.2); + shutte.setStudio(pp); + shutte.getDirectors().add(mScorsese); + mScorsese.getMovies().add(shutte); + pp.getMovies().add(shutte); + movieRepository.save(shutte); + + Movie casino = new Movie("Casino", 2002, 8.2); + casino.setStudio(up); + casino.getDirectors().add(mScorsese); + mScorsese.getMovies().add(casino); + up.getMovies().add(casino); + movieRepository.save(casino); + + Movie goodf = new Movie("Goodfellas", 1990, 8.7); + goodf.setStudio(wb); + goodf.getDirectors().add(mScorsese); + mScorsese.getMovies().add(goodf); + wb.getMovies().add(goodf); + movieRepository.save(goodf); + + Movie taxid = new Movie("Taxi Driver", 1976, 8.2); + taxid.setStudio(cp); + taxid.getDirectors().add(mScorsese); + mScorsese.getMovies().add(taxid); + cp.getMovies().add(taxid); + movieRepository.save(taxid); + +//Print test statements + System.out.println("Number of Movies: " + movieRepository.count()); + System.out.println("Number of Studios: " + studioRepository.count()); + System.out.println("Number of Directors: " + directorRepository.count()); + System.out.println("Warner Bros number of Movies: " + wb.getMovies().size()); + System.out.println("Columbia Pictures number of Movies: " + cp.getMovies().size()); + System.out.println("Paramount Pictures number of Movies: " + pp.getMovies().size()); + System.out.println("Walt Disney Studio number of Movies: " + wds.getMovies().size()); + System.out.println("Annapurna Pictures number of Movies: " + ap.getMovies().size()); + System.out.println("Sony Pictures number of Movies: " + sp.getMovies().size()); + System.out.println("Universal Pictures number of Movies: " + up.getMovies().size()); + + + + + + } +} diff --git a/src/main/java/guru/springframework/spring5webapp/domain/Director.java b/src/main/java/guru/springframework/spring5webapp/domain/Director.java new file mode 100644 index 0000000000..fcfa143d1e --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/domain/Director.java @@ -0,0 +1,74 @@ +package guru.springframework.spring5webapp.domain; +import javax.persistence.*; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +@Entity //not sure why here. annotate the entire class. Tells hibernate this is an entity. We need a private key though or error +public class Director { + + @Id //this sets the id variable below as the private key + @GeneratedValue(strategy = GenerationType.AUTO) //tells hibernate how it is getting generated. Syntax means the id value will be generated by the database (mySQL) + private Long id; //private key. Still needs getters and setters + private String firstName; + private String lastName; + @ManyToMany(mappedBy = "directors") //defines relationship between Director and Movie class. Directors can make multiple movies and movies can have many directors. + private Set movies = new HashSet<>(); + + + public Director() { + } + public Director(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + public String getFirstName() { + return firstName; + } + public String getLastName() { + return lastName; + } + public void setFirstName(String firstName) { + this.firstName = firstName; + } + public void setLastName(String lastName) { + this.lastName = lastName; + } + public Set getMovies() { + return movies; + } + public void setMovies(Set movies) { + this.movies = movies; + } + + @Override + public String toString() { + return "Director{" + + "id=" + id + + ", firstName='" + firstName + '\'' + + ", lastName='" + lastName + '\'' + + ", movies=" + movies + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Director director = (Director) o; + + return Objects.equals(id, director.id); + } + + @Override + public int hashCode() { + return id != null ? id.hashCode() : 0; + } +} diff --git a/src/main/java/guru/springframework/spring5webapp/domain/Movie.java b/src/main/java/guru/springframework/spring5webapp/domain/Movie.java new file mode 100644 index 0000000000..1f265440e3 --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/domain/Movie.java @@ -0,0 +1,91 @@ +package guru.springframework.spring5webapp.domain; +import javax.persistence.*; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +@Entity +public class Movie { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + private String title; + private int year; + private double imdbRating; + @ManyToOne + private Studio studio; + @ManyToMany //mapping many-to-many relationships like @JoinTable does below is somewhat complex compared to other database relationship types + @JoinTable(name = "director_movie", joinColumns = @JoinColumn(name = "movie_id"), inverseJoinColumns = @JoinColumn(name = "director_id")) + private Set directors = new HashSet<>(); + + public Movie() { + } + + public Movie(String title, int year, double imdbRating){ + this.title = title; + this.year = year; + this.imdbRating = imdbRating; + } + + public Studio getStudio() { + return studio; + } + public void setStudio(Studio studio) { + this.studio = studio; + } + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + public String getTitle() { + return title; + } + public void setTitle(String title) { + this.title = title; + } + public int getYear() { + return year; + } + public void setYear(int year) { + this.year = year; + } + public double getImdbRating() { + return imdbRating; + } + public void setImdbRating(double imdbRating) { + this.imdbRating = imdbRating; + } + public Set getDirectors() { + return directors; + } + public void setDirectors(Set directors) { + this.directors = directors; + } + + @Override //confused about purpose + public String toString() { + return "Movie{" + + "id=" + id + + ", title='" + title + '\'' + + ", directors=" + directors + + ", studio=" + studio + + '}'; + } + + @Override //confused about purpose of override and equals() method + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Movie movie = (Movie) o; //how does this syntax even make sense? + + return Objects.equals(id, movie.id); + } + + @Override //confused about purpose of override and hashCode() method + public int hashCode() { + return id != null ? id.hashCode() : 0; + } +} diff --git a/src/main/java/guru/springframework/spring5webapp/domain/Studio.java b/src/main/java/guru/springframework/spring5webapp/domain/Studio.java new file mode 100644 index 0000000000..5176e2c963 --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/domain/Studio.java @@ -0,0 +1,91 @@ +package guru.springframework.spring5webapp.domain; + +import javax.persistence.*; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +@Entity +public class Studio { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String name; + private String addressLine; + private String city; + private String state; + private String zip; + + @OneToMany + @JoinColumn(name = "studio_id") + private Set movies = new HashSet<>(); + public Studio() { + } + public Set getMovies() { + return movies; + } + public void setMovies(Set movies) { + this.movies = movies; + } + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getAddressLine() { + return addressLine; + } + public void setAddressLine(String addressLine) { + this.addressLine = addressLine; + } + public String getCity() { + return city; + } + public void setCity(String city) { + this.city = city; + } + public String getState() { + return state; + } + public void setState(String state) { + this.state = state; + } + public String getZip() { + return zip; + } + public void setZip(String zip) { + this.zip = zip; + } + + @Override + public String toString() { + return "Studio{" + + "id=" + id + + ", name='" + name + '\'' + + ", city='" + city + '\'' + + ", state='" + state + '\'' + + ", zip='" + zip + '\'' + + '}'; + } + @Override + public boolean equals(Object o) { //huh? + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Studio studio = (Studio) o; + + return Objects.equals(id, studio.id); + } + @Override + public int hashCode() { //huh? + return id != null ? id.hashCode() : 0; + } +} diff --git a/src/main/java/guru/springframework/spring5webapp/repositories/DirectorRepository.java b/src/main/java/guru/springframework/spring5webapp/repositories/DirectorRepository.java new file mode 100644 index 0000000000..fc3ed99bc2 --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/repositories/DirectorRepository.java @@ -0,0 +1,7 @@ +package guru.springframework.spring5webapp.repositories; + +import guru.springframework.spring5webapp.domain.Director; +import org.springframework.data.repository.CrudRepository; + +public interface DirectorRepository extends CrudRepository { +} diff --git a/src/main/java/guru/springframework/spring5webapp/repositories/MovieRepository.java b/src/main/java/guru/springframework/spring5webapp/repositories/MovieRepository.java new file mode 100644 index 0000000000..24e0416413 --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/repositories/MovieRepository.java @@ -0,0 +1,7 @@ +package guru.springframework.spring5webapp.repositories; + +import guru.springframework.spring5webapp.domain.Movie; +import org.springframework.data.repository.CrudRepository; + +public interface MovieRepository extends CrudRepository { +} diff --git a/src/main/java/guru/springframework/spring5webapp/repositories/StudioRepository.java b/src/main/java/guru/springframework/spring5webapp/repositories/StudioRepository.java new file mode 100644 index 0000000000..6ff4be8025 --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/repositories/StudioRepository.java @@ -0,0 +1,7 @@ +package guru.springframework.spring5webapp.repositories; + +import guru.springframework.spring5webapp.domain.Studio; +import org.springframework.data.repository.CrudRepository; + +public interface StudioRepository extends CrudRepository { +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e69de29bb2..69b89983cb 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.h2.console.enabled=true \ No newline at end of file