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