From 2d404ea2173ea0a31b8ff65d147a8e1566b20b50 Mon Sep 17 00:00:00 2001
From: opitzju <julian.opitz@stud.hs-hannover.de>
Date: Mon, 29 Nov 2021 00:31:15 +0100
Subject: [PATCH] =?UTF-8?q?Entit=C3=A4ten=20implementiert?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .gitignore                                    |  2 +-
 lombok.config                                 |  1 +
 pom.xml                                       |  7 ++-
 src/main/java/edu/hsh/dbs2/imdb/Starter.java  |  6 +--
 .../java/edu/hsh/dbs2/imdb/entity/Genre.java  | 33 ++++++++++++
 .../java/edu/hsh/dbs2/imdb/entity/Movie.java  | 42 +++++++++++++++
 .../hsh/dbs2/imdb/entity/MovieCharacter.java  | 40 ++++++++++++++
 .../edu/hsh/dbs2/imdb/entity/MovieType.java   |  5 ++
 .../java/edu/hsh/dbs2/imdb/entity/Person.java | 29 ++++++++++
 .../java/edu/hsh/dbs2/imdb/entity/Sex.java    |  5 ++
 src/main/resources/DropSchema.sql             |  9 ++++
 .../META-INF/persistence.example.xml          | 19 +++++++
 src/main/resources/META-INF/persistence.xml   | 23 --------
 src/main/resources/Schema.sql                 | 14 +++++
 src/test/java/edu/hsh/dbs2/imdb/TestDB.java   | 53 +++++++++++++++++++
 15 files changed, 260 insertions(+), 28 deletions(-)
 create mode 100644 lombok.config
 create mode 100644 src/main/java/edu/hsh/dbs2/imdb/entity/Genre.java
 create mode 100644 src/main/java/edu/hsh/dbs2/imdb/entity/Movie.java
 create mode 100644 src/main/java/edu/hsh/dbs2/imdb/entity/MovieCharacter.java
 create mode 100644 src/main/java/edu/hsh/dbs2/imdb/entity/MovieType.java
 create mode 100644 src/main/java/edu/hsh/dbs2/imdb/entity/Person.java
 create mode 100644 src/main/java/edu/hsh/dbs2/imdb/entity/Sex.java
 create mode 100644 src/main/resources/DropSchema.sql
 create mode 100644 src/main/resources/META-INF/persistence.example.xml
 delete mode 100644 src/main/resources/META-INF/persistence.xml
 create mode 100644 src/main/resources/Schema.sql
 create mode 100644 src/test/java/edu/hsh/dbs2/imdb/TestDB.java

diff --git a/.gitignore b/.gitignore
index 038bdf2..ed530c6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -43,4 +43,4 @@ atlassian-ide-plugin.xml
 
 # Project Specific #
 ####################
-/src/main/resources/config.properties
\ No newline at end of file
+/src/main/resources/META-INF/persistence.xml
\ No newline at end of file
diff --git a/lombok.config b/lombok.config
new file mode 100644
index 0000000..5d11ccc
--- /dev/null
+++ b/lombok.config
@@ -0,0 +1 @@
+lombok.var.flagUsage = error
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 8f43637..d12c700 100644
--- a/pom.xml
+++ b/pom.xml
@@ -30,9 +30,14 @@
     </dependency>
     <dependency>
       <groupId>org.hibernate</groupId>
-      <artifactId>hibernate-core</artifactId>
+      <artifactId>hibernate-core-jakarta</artifactId>
       <version>5.6.1.Final</version>
     </dependency>
+    <dependency>
+      <groupId>org.projectlombok</groupId>
+      <artifactId>lombok</artifactId>
+      <version>1.18.22</version>
+    </dependency>
   </dependencies>
 
   <build>
diff --git a/src/main/java/edu/hsh/dbs2/imdb/Starter.java b/src/main/java/edu/hsh/dbs2/imdb/Starter.java
index 741fce0..1cb45af 100644
--- a/src/main/java/edu/hsh/dbs2/imdb/Starter.java
+++ b/src/main/java/edu/hsh/dbs2/imdb/Starter.java
@@ -1,10 +1,10 @@
 package edu.hsh.dbs2.imdb;
 
-import javax.swing.SwingUtilities;
-
 import edu.hsh.dbs2.imdb.gui.SearchMovieDialog;
 import edu.hsh.dbs2.imdb.gui.SearchMovieDialogCallback;
 
+import javax.swing.*;
+
 public class Starter {
 
 	/**
@@ -12,7 +12,7 @@ public class Starter {
 	 * @throws Throwable 
 	 */
 	public static void main(String[] args) throws Throwable {
-		
+
 		SwingUtilities.invokeLater(new Runnable() {
 			@Override
 			public void run() {
diff --git a/src/main/java/edu/hsh/dbs2/imdb/entity/Genre.java b/src/main/java/edu/hsh/dbs2/imdb/entity/Genre.java
new file mode 100644
index 0000000..1026f6a
--- /dev/null
+++ b/src/main/java/edu/hsh/dbs2/imdb/entity/Genre.java
@@ -0,0 +1,33 @@
+package edu.hsh.dbs2.imdb.entity;
+
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
+
+import jakarta.persistence.*;
+
+import java.util.Set;
+
+@Getter
+@Setter
+@EqualsAndHashCode(onlyExplicitlyIncluded = true)
+@Entity
+@Table(name = "Genre")
+public class Genre {
+    private static final String SEQUENCE_NAME = "seq_genre";
+
+    @Id
+    @Column(name = "ID")
+    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SEQUENCE_NAME)
+    @SequenceGenerator(name = SEQUENCE_NAME, allocationSize = 10)
+    @EqualsAndHashCode.Include
+    private Long id;
+
+    @Column(name = "Genre", nullable = false, unique = true)
+    private String genre;
+
+    @ManyToMany
+    @JoinTable(name = "MovieGenre", joinColumns = @JoinColumn(name = "GenreID"),
+            inverseJoinColumns = @JoinColumn(name = "MovieID"))
+    private Set<Movie> movies;
+}
diff --git a/src/main/java/edu/hsh/dbs2/imdb/entity/Movie.java b/src/main/java/edu/hsh/dbs2/imdb/entity/Movie.java
new file mode 100644
index 0000000..7dd244d
--- /dev/null
+++ b/src/main/java/edu/hsh/dbs2/imdb/entity/Movie.java
@@ -0,0 +1,42 @@
+package edu.hsh.dbs2.imdb.entity;
+
+import jakarta.persistence.*;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Set;
+
+@Getter
+@Setter
+@EqualsAndHashCode(onlyExplicitlyIncluded = true)
+@Entity
+@Table(name = "Movie")
+public class Movie {
+    private static final String SEQUENCE_NAME = "seq_movie";
+
+    @Id
+    @Column(name = "ID")
+    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SEQUENCE_NAME)
+    @SequenceGenerator(name = SEQUENCE_NAME, allocationSize = 10)
+    @EqualsAndHashCode.Include
+    private Long id;
+
+    @Column(name = "Title", nullable = false)
+    private String title;
+
+    @Column(name = "Year")
+    private Integer year;
+
+    @Column(name = "Type")
+    @Enumerated(EnumType.STRING)
+    private MovieType type;
+
+    @OneToMany(cascade = CascadeType.ALL, mappedBy = "movie")
+    private Set<MovieCharacter> characters;
+
+    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
+    @JoinTable(name = "MovieGenre", joinColumns = @JoinColumn(name = "MovieID"),
+            inverseJoinColumns = @JoinColumn(name = "GenreID"))
+    private Set<Genre> genre;
+}
diff --git a/src/main/java/edu/hsh/dbs2/imdb/entity/MovieCharacter.java b/src/main/java/edu/hsh/dbs2/imdb/entity/MovieCharacter.java
new file mode 100644
index 0000000..31e1465
--- /dev/null
+++ b/src/main/java/edu/hsh/dbs2/imdb/entity/MovieCharacter.java
@@ -0,0 +1,40 @@
+package edu.hsh.dbs2.imdb.entity;
+
+import jakarta.persistence.*;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+@EqualsAndHashCode(onlyExplicitlyIncluded = true)
+@Entity
+@Table(name = "MovieCharacter")
+public class MovieCharacter {
+    private static final String SEQUENCE_NAME = "seq_character";
+
+    @Id
+    @Column(name = "ID")
+    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SEQUENCE_NAME)
+    @SequenceGenerator(name = SEQUENCE_NAME, allocationSize = 10)
+    @EqualsAndHashCode.Include
+    private Long id;
+
+    @Column(name = "Character", nullable = false)
+    private String character;
+
+    @Column(name = "Alias")
+    private String alias;
+
+    @Column(name = "Position")
+    private Integer position;
+
+    @ManyToOne
+    @JoinColumn(name = "Actor")
+    private Person actor;
+
+    @ManyToOne
+    @JoinColumn(name = "Movie", nullable = false)
+    private Movie movie;
+
+}
diff --git a/src/main/java/edu/hsh/dbs2/imdb/entity/MovieType.java b/src/main/java/edu/hsh/dbs2/imdb/entity/MovieType.java
new file mode 100644
index 0000000..1a19293
--- /dev/null
+++ b/src/main/java/edu/hsh/dbs2/imdb/entity/MovieType.java
@@ -0,0 +1,5 @@
+package edu.hsh.dbs2.imdb.entity;
+
+public enum MovieType {
+    V, T, C, G;
+}
diff --git a/src/main/java/edu/hsh/dbs2/imdb/entity/Person.java b/src/main/java/edu/hsh/dbs2/imdb/entity/Person.java
new file mode 100644
index 0000000..b61f250
--- /dev/null
+++ b/src/main/java/edu/hsh/dbs2/imdb/entity/Person.java
@@ -0,0 +1,29 @@
+package edu.hsh.dbs2.imdb.entity;
+
+import jakarta.persistence.*;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+@EqualsAndHashCode(onlyExplicitlyIncluded = true)
+@Entity
+@Table(name = "Person")
+public class Person {
+    private static final String SEQUENCE_NAME = "seq_person";
+
+    @Id
+    @Column(name = "ID")
+    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SEQUENCE_NAME)
+    @SequenceGenerator(name = SEQUENCE_NAME, allocationSize = 10)
+    @EqualsAndHashCode.Include
+    private Long id;
+
+    @Column(name = "Name", nullable = false, unique = true)
+    private String name;
+
+    @Column(name = "Sex")
+    @Enumerated(EnumType.STRING)
+    private Sex sex;
+}
diff --git a/src/main/java/edu/hsh/dbs2/imdb/entity/Sex.java b/src/main/java/edu/hsh/dbs2/imdb/entity/Sex.java
new file mode 100644
index 0000000..caf7f7c
--- /dev/null
+++ b/src/main/java/edu/hsh/dbs2/imdb/entity/Sex.java
@@ -0,0 +1,5 @@
+package edu.hsh.dbs2.imdb.entity;
+
+public enum Sex {
+    f, m;
+}
diff --git a/src/main/resources/DropSchema.sql b/src/main/resources/DropSchema.sql
new file mode 100644
index 0000000..2f7a112
--- /dev/null
+++ b/src/main/resources/DropSchema.sql
@@ -0,0 +1,9 @@
+DROP TABLE MovieGenre;
+DROP TABLE MovieCharacter;
+DROP TABLE Person;
+DROP TABLE Genre;
+DROP TABLE Movie;
+DROP SEQUENCE seq_movie;
+DROP SEQUENCE seq_genre;
+DROP SEQUENCE seq_person;
+DROP SEQUENCE seq_character;
\ No newline at end of file
diff --git a/src/main/resources/META-INF/persistence.example.xml b/src/main/resources/META-INF/persistence.example.xml
new file mode 100644
index 0000000..1e3fca3
--- /dev/null
+++ b/src/main/resources/META-INF/persistence.example.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<persistence xmlns="https://jakarta.ee/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.0"
+             xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence  https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd">
+    <persistence-unit name="edu.hsh.dbs2.imdb">
+        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
+        <properties>
+            <property name="jakarta.persistence.jdbc.driver" value="oracle.jdbc.driver.OracleDriver"/>
+            <property name="jakarta.persistence.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:db01"/>
+            <property name="jakarta.persistence.jdbc.user" value=""/>
+            <property name="jakarta.persistence.jdbc.password" value=""/>
+            <property name="jakarta.persistence.schema-generation.database.action" value="drop-and-create" />
+            <property name="jakarta.persistence.schema-generation.create-source" value="script"/>
+            <property name="jakarta.persistence.schema-generation.drop-source" value="script"/>
+            <property name="jakarta.persistence.schema-generation.create-script-source" value="src/main/resources/Schema.sql"/>
+            <property name="jakarta.persistence.schema-generation.drop-script-source" value="src/main/resources/DropSchema.sql"/>
+            <property name="hibernate.check_nullability" value="true"/>
+        </properties>
+    </persistence-unit>
+</persistence>
\ No newline at end of file
diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml
deleted file mode 100644
index 61a9d9a..0000000
--- a/src/main/resources/META-INF/persistence.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"
-             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
-    <persistence-unit name="movie">
-        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
-        <properties>
-            <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.driver.OracleDriver"/>
-            <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@dboracleserv.inform.hs-hannover.de:1521/db01"/>
-            <property name="javax.persistence.jdbc.user" value=""/>
-            <property name="javax.persistence.jdbc.password" value=""/>
-            <property name="hibernate.show_sql" value="true"/>
-            <property name="hibernate.hbm2ddl.auto" value="update"/>
-            <!--
-
-            values:
-            validate: validate the schema, makes no changes to the database.
-            update: update the schema.
-            create: creates the schema, destroying previous data.
-            create-drop: drop the schema when the SessionFactory is closed explicitly, typically when the application is stopped.
-            none: does nothing
-            -->
-        </properties>
-    </persistence-unit>
-</persistence>
\ No newline at end of file
diff --git a/src/main/resources/Schema.sql b/src/main/resources/Schema.sql
new file mode 100644
index 0000000..d6102ea
--- /dev/null
+++ b/src/main/resources/Schema.sql
@@ -0,0 +1,14 @@
+CREATE TABLE Movie (ID INT NOT NULL, Title VARCHAR(255) NOT NULL, Year INT, Type CHAR(1), PRIMARY KEY (ID));
+
+CREATE TABLE Genre (ID INT NOT NULL, Genre VARCHAR(255) NOT NULL UNIQUE, PRIMARY KEY (ID));
+
+CREATE TABLE Person (ID INT NOT NULL, Name VARCHAR(255) NOT NULL, Sex CHAR(1), PRIMARY KEY (ID));
+
+CREATE TABLE MovieCharacter (ID INT NOT NULL, Character VARCHAR(255) NOT NULL, Alias VARCHAR(255), Position INT, Movie INT NOT NULL, Actor INT, PRIMARY KEY (ID), FOREIGN KEY (Movie) REFERENCES Movie(ID), FOREIGN KEY (Actor) REFERENCES Person(ID), CONSTRAINT MOVIE_CHAR_UNIQUE UNIQUE(Character, Movie, Actor));
+
+CREATE TABLE MovieGenre (MovieID INT NOT NULL, GenreID INT NOT NULL, CONSTRAINT MOVIEGENRE_PK PRIMARY KEY (MovieID,GenreID), FOREIGN KEY (MovieID) REFERENCES Movie(ID), FOREIGN KEY (GenreID) REFERENCES Genre(ID));
+
+CREATE SEQUENCE seq_movie INCREMENT BY 10;
+CREATE SEQUENCE seq_genre INCREMENT BY 10;
+CREATE SEQUENCE seq_person INCREMENT BY 10;
+CREATE SEQUENCE seq_character INCREMENT BY 10;
\ No newline at end of file
diff --git a/src/test/java/edu/hsh/dbs2/imdb/TestDB.java b/src/test/java/edu/hsh/dbs2/imdb/TestDB.java
new file mode 100644
index 0000000..5bc4018
--- /dev/null
+++ b/src/test/java/edu/hsh/dbs2/imdb/TestDB.java
@@ -0,0 +1,53 @@
+package edu.hsh.dbs2.imdb;
+
+import edu.hsh.dbs2.imdb.entity.Genre;
+import edu.hsh.dbs2.imdb.entity.Person;
+import edu.hsh.dbs2.imdb.entity.Sex;
+import jakarta.persistence.EntityManagerFactory;
+import jakarta.persistence.Persistence;
+import jakarta.persistence.PersistenceException;
+import lombok.Cleanup;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class TestDB {
+    private static EntityManagerFactory sessionFactory;
+
+    @BeforeClass
+    public static void setUp() {
+        sessionFactory = Persistence.createEntityManagerFactory("edu.hsh.dbs2.imdb");
+    }
+
+    @AfterClass
+    public static void tearDown() {
+        sessionFactory.close();
+    }
+
+    @Test
+    public void testDB() {
+        @Cleanup var em = sessionFactory.createEntityManager();
+        em.getTransaction().begin();
+        var genre = new Genre();
+        genre.setGenre("testGenre");
+        em.persist(genre);
+        em.flush();
+        em.getTransaction().commit();
+        var result = em.createQuery("from Genre", Genre.class).getSingleResult();
+        assertEquals("testGenre", result.getGenre());
+        assertEquals(1L, genre.getId().longValue());
+    }
+
+    @Test(expected = PersistenceException.class)
+    public void testNullNotPermitted() {
+        @Cleanup var em = sessionFactory.createEntityManager();
+        var person = new Person();
+        person.setSex(Sex.f);
+        em.getTransaction().begin();
+        em.persist(person);
+        em.flush();
+        em.getTransaction().commit();
+    }
+}
-- 
GitLab