From cd5855350223bc6240d112acfe9c6ed2760c65a5 Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 09:57:05 +0000 Subject: [PATCH 1/8] add deadline --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5150e50f..05def9a9 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +[![Review Assignment Due Date](https://classroom.github.com/assets/deadline-readme-button-22041afd0340ce965d47ae6ef1cefeee28c7c493a6346c4f15d667ab976d596c.svg)](https://classroom.github.com/a/_uV8Mn8f) # 📘 Projektarbete: JPA + Hibernate med GitHub-flöde Projektet genomförs som antingen en Java CLI-applikation eller med hjĂ€lp av JavaFX om ni vill ha ett grafiskt grĂ€nssnitt. From f043eb4c25aeb91357754a7f20fb7a85af8b1a4e Mon Sep 17 00:00:00 2001 From: Linnea Vardal Date: Tue, 16 Dec 2025 10:00:21 +0100 Subject: [PATCH 2/8] Add Main and Film class. Add persistenceconfiguration in Main. Add Entity in Film. Co-authored-by: Mattias Barth mattias.barth@gmail.com EdvinSandgren 229709012+EdvinSandgren@users.noreply.github.com johanhiths Johan.hietala@iths.se --- src/main/java/Film.java | 40 ++++++++++++++++++++++++++++++++++++++++ src/main/java/Main.java | 23 +++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 src/main/java/Film.java create mode 100644 src/main/java/Main.java diff --git a/src/main/java/Film.java b/src/main/java/Film.java new file mode 100644 index 00000000..82eb775d --- /dev/null +++ b/src/main/java/Film.java @@ -0,0 +1,40 @@ +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; + +@Entity +public class Film { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + String title; + String director; + + public String getDirector() { + return director; + } + + public void setDirector(String director) { + this.director = director; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getId() { + return id; + } + + +} diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 00000000..5b7b0822 --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,23 @@ +import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.PersistenceConfiguration; +import org.hibernate.jpa.HibernatePersistenceConfiguration; + +import java.util.List; + +public class Main { + static void main() { + + + final PersistenceConfiguration cfg = new HibernatePersistenceConfiguration("emf") + .jdbcUrl("jdbc:mysql://localhost:3306/jpa") + .jdbcUsername("root") + .jdbcPassword("root") + .property("hibernate.hbm2ddl.auto", "update") + .property("hibernate.show_sql", "true") + .property("hibernate.format_sql", "true") + .property("hibernate.highlight_sql", "true") + .managedClasses(); + + +} +} From 86c2ac25f05b24abc12df9276ff782701d0f9a68 Mon Sep 17 00:00:00 2001 From: Linnea Vardal Date: Tue, 16 Dec 2025 10:51:43 +0100 Subject: [PATCH 3/8] Add Director Class with getters and setters. Co-authored-by: Mattias Barth mattias.barth@gmail.com EdvinSandgren 229709012+EdvinSandgren@users.noreply.github.com johanhiths Johan.hietala@iths.se --- src/main/java/Director.java | 60 +++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/main/java/Director.java diff --git a/src/main/java/Director.java b/src/main/java/Director.java new file mode 100644 index 00000000..6c05171c --- /dev/null +++ b/src/main/java/Director.java @@ -0,0 +1,60 @@ +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; + +@Entity +public class Director { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + String name; + String country; + int birthYear; + int yearOfDeath; + + public int getYearOfDeath() { + return yearOfDeath; + } + + public void setYearOfDeath(int yearOfDeath) { + this.yearOfDeath = yearOfDeath; + } + + public int getBirthYear() { + return birthYear; + } + + public void setBirthYear(int birthYear) { + this.birthYear = birthYear; + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getId() { + return id; + } + + +} + + From 5c33218e5d96b7f918cf4b9a6a12be06b63b4997 Mon Sep 17 00:00:00 2001 From: Linnea Vardal Date: Tue, 16 Dec 2025 13:13:59 +0100 Subject: [PATCH 4/8] Add entity manager to Main. Co-authored-by: Mattias Barth mattias.barth@gmail.com EdvinSandgren 229709012+EdvinSandgren@users.noreply.github.com johanhiths Johan.hietala@iths.se --- src/main/java/Main.java | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 5b7b0822..d0b5b088 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,23 +1,42 @@ +import jakarta.persistence.Entity; import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.Persistence; import jakarta.persistence.PersistenceConfiguration; import org.hibernate.jpa.HibernatePersistenceConfiguration; import java.util.List; public class Main { - static void main() { + public static void main(String[] args) { final PersistenceConfiguration cfg = new HibernatePersistenceConfiguration("emf") - .jdbcUrl("jdbc:mysql://localhost:3306/jpa") + .jdbcUrl("jdbc:mysql://localhost:3306/film_database") .jdbcUsername("root") .jdbcPassword("root") .property("hibernate.hbm2ddl.auto", "update") .property("hibernate.show_sql", "true") .property("hibernate.format_sql", "true") .property("hibernate.highlight_sql", "true") - .managedClasses(); + .managedClasses(Film.class, Director.class); + try (EntityManagerFactory emf = cfg.createEntityManagerFactory()) { + emf.runInTransaction(em -> { + //If no Organizations in database, add some + if (em.createQuery("select count(o) from Film o", Long.class) + .getSingleResult() == 0) { + Film film1 = new Film(); + em.persist(film1); + em.flush(); + Film film2 = new Film(); + em.persist(film2); + } + System.out.println("==== Using select query, N + 1 ===="); + em.createQuery("from Film", Film.class) + .getResultList().forEach(System.out::println); + }); -} + } + + } } From c5b0d5ff43f68f3e1be2aaa8625744dae4dd8fbf Mon Sep 17 00:00:00 2001 From: Linnea Vardal Date: Tue, 16 Dec 2025 14:00:01 +0100 Subject: [PATCH 5/8] Add OneToMany in Director Class. Add ManyToOne in Film Class. Co-authored-by: Mattias Barth mattias.barth@gmail.com EdvinSandgren 229709012+EdvinSandgren@users.noreply.github.com johanhiths Johan.hietala@iths.se --- src/main/java/Director.java | 13 +++++++++---- src/main/java/Film.java | 12 +++++------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/main/java/Director.java b/src/main/java/Director.java index 6c05171c..db0ca147 100644 --- a/src/main/java/Director.java +++ b/src/main/java/Director.java @@ -1,14 +1,19 @@ -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; +import jakarta.persistence.*; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; @Entity public class Director { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @OneToMany(mappedBy = "director") + private Set film = new HashSet<>(); + String name; String country; int birthYear; diff --git a/src/main/java/Film.java b/src/main/java/Film.java index 82eb775d..94bf19dd 100644 --- a/src/main/java/Film.java +++ b/src/main/java/Film.java @@ -1,7 +1,4 @@ -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; +import jakarta.persistence.*; @Entity public class Film { @@ -10,13 +7,14 @@ public class Film { private Long id; String title; - String director; + @ManyToOne + Director director; - public String getDirector() { + public Director getDirector() { return director; } - public void setDirector(String director) { + public void setDirector(Director director) { this.director = director; } From 3f3262f65223d1016cba98e2c77abab1393c1279 Mon Sep 17 00:00:00 2001 From: Linnea Vardal Date: Tue, 16 Dec 2025 14:25:25 +0100 Subject: [PATCH 6/8] Made yearOfDeath nullable. Co-authored-by: Mattias Barth mattias.barth@gmail.com EdvinSandgren 229709012+EdvinSandgren@users.noreply.github.com johanhiths Johan.hietala@iths.se --- src/main/java/Director.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/Director.java b/src/main/java/Director.java index db0ca147..f269f52c 100644 --- a/src/main/java/Director.java +++ b/src/main/java/Director.java @@ -17,6 +17,7 @@ public class Director { String name; String country; int birthYear; + @Column(nullable = true) int yearOfDeath; public int getYearOfDeath() { From 5125f3acb9cb3017cb933123eb38bea74c9c2362 Mon Sep 17 00:00:00 2001 From: Linnea Vardal Date: Wed, 17 Dec 2025 09:20:34 +0100 Subject: [PATCH 7/8] Fixed issues according to Coderabbit. Co-authored-by: Mattias Barth mattias.barth@gmail.com EdvinSandgren 229709012+EdvinSandgren@users.noreply.github.com johanhiths Johan.hietala@iths.se --- src/main/java/Director.java | 24 +++++++++++++++++------- src/main/java/Film.java | 5 +++-- src/main/java/Main.java | 2 +- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/main/java/Director.java b/src/main/java/Director.java index f269f52c..f34554c3 100644 --- a/src/main/java/Director.java +++ b/src/main/java/Director.java @@ -12,19 +12,29 @@ public class Director { private Long id; @OneToMany(mappedBy = "director") - private Set film = new HashSet<>(); + private Set films = new HashSet<>(); - String name; - String country; - int birthYear; + private String name; + private String country; + private int birthYear; @Column(nullable = true) - int yearOfDeath; + private Integer yearOfDeath; - public int getYearOfDeath() { + + + public Set getFilms() { + return films; + } + + public void setFilms(Set films) { + this.films = films; + } + + public Integer getYearOfDeath() { return yearOfDeath; } - public void setYearOfDeath(int yearOfDeath) { + public void setYearOfDeath(Integer yearOfDeath) { this.yearOfDeath = yearOfDeath; } diff --git a/src/main/java/Film.java b/src/main/java/Film.java index 94bf19dd..6beaac82 100644 --- a/src/main/java/Film.java +++ b/src/main/java/Film.java @@ -6,9 +6,10 @@ public class Film { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - String title; + private String title; @ManyToOne - Director director; + @JoinColumn(name = "director_id") + private Director director; public Director getDirector() { return director; diff --git a/src/main/java/Main.java b/src/main/java/Main.java index d0b5b088..d6254896 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -21,7 +21,7 @@ public static void main(String[] args) { .managedClasses(Film.class, Director.class); try (EntityManagerFactory emf = cfg.createEntityManagerFactory()) { emf.runInTransaction(em -> { - //If no Organizations in database, add some + //If no Films in database, add some if (em.createQuery("select count(o) from Film o", Long.class) .getSingleResult() == 0) { Film film1 = new Film(); From efe47e398282f61d5c82e7e6972cd0325e662a97 Mon Sep 17 00:00:00 2001 From: Linnea Vardal Date: Thu, 8 Jan 2026 08:45:25 +0100 Subject: [PATCH 8/8] Add crud-methods in Film-class. Add test code for crud-operations i Main-class Co-authored-by: Mattias Barth mattias.barth@gmail.com --- src/main/java/Director.java | 3 --- src/main/java/Film.java | 22 +++++++++++++++++++ src/main/java/Main.java | 43 +++++++++++++++++++++++++++---------- 3 files changed, 54 insertions(+), 14 deletions(-) diff --git a/src/main/java/Director.java b/src/main/java/Director.java index f34554c3..ac95026f 100644 --- a/src/main/java/Director.java +++ b/src/main/java/Director.java @@ -20,8 +20,6 @@ public class Director { @Column(nullable = true) private Integer yearOfDeath; - - public Set getFilms() { return films; } @@ -70,7 +68,6 @@ public Long getId() { return id; } - } diff --git a/src/main/java/Film.java b/src/main/java/Film.java index 6beaac82..9b55dbda 100644 --- a/src/main/java/Film.java +++ b/src/main/java/Film.java @@ -1,5 +1,7 @@ import jakarta.persistence.*; +import java.util.List; + @Entity public class Film { @Id @@ -35,5 +37,25 @@ public Long getId() { return id; } + //LĂ€gg till en ny film + public static void addFilm(EntityManager em, String title, Director director) { + Film film = new Film(); + film.setTitle(title); + film.setDirector(director); + em.persist(film); + System.out.println("Film tillagd: " + title); + } + //HĂ€mta alla filmer + public static List getAllFilms(EntityManager em) { + return em.createQuery("FROM Film", Film.class).getResultList(); + } + + //HĂ€mta filmer regisserade av en viss regissör + public static List getFilmsByDirector(EntityManager em, Director director) { + return em.createQuery("FROM Film f WHERE f.director = :director", Film.class) + .setParameter("director", director) + .getResultList(); + } + } diff --git a/src/main/java/Main.java b/src/main/java/Main.java index d6254896..f957efcd 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -21,18 +21,39 @@ public static void main(String[] args) { .managedClasses(Film.class, Director.class); try (EntityManagerFactory emf = cfg.createEntityManagerFactory()) { emf.runInTransaction(em -> { + //Skapa regissör för test + Director director = new Director(); + director.setName("Christopher Bolan"); + director.setCountry("United States"); + director.setBirthYear(1970); + em.persist(director); + + //Testa att lĂ€gga till filmer + Film.addFilm(em, "The Dirk Knight", director); + Film.addFilm(em, "Inception", director); + + //Testa att hĂ€mta alla filmer + System.out.println("\nAlla filmer:"); + List films = Film.getAllFilms(em); + films.forEach(film -> System.out.println(film.getTitle())); + + //Testa att hĂ€mta filmer av en viss regissör + System.out.println("\nAlla filmer av regissör:"); + List filmsByDirector = Film.getFilmsByDirector(em, director); + filmsByDirector.forEach(film -> System.out.println(film.getTitle())); + //If no Films in database, add some - if (em.createQuery("select count(o) from Film o", Long.class) - .getSingleResult() == 0) { - Film film1 = new Film(); - em.persist(film1); - em.flush(); - Film film2 = new Film(); - em.persist(film2); - } - System.out.println("==== Using select query, N + 1 ===="); - em.createQuery("from Film", Film.class) - .getResultList().forEach(System.out::println); +// if (em.createQuery("select count(o) from Film o", Long.class) +// .getSingleResult() == 0) { +// Film film1 = new Film(); +// em.persist(film1); +// em.flush(); +// Film film2 = new Film(); +// em.persist(film2); +// } +// System.out.println("==== Using select query, N + 1 ===="); +// em.createQuery("from Film", Film.class) +// .getResultList().forEach(System.out::println); });