diff --git a/.gitignore b/.gitignore
index 038bdf2b6842e09b1ab7fe5031ad8c8dfae9ded9..ed530c64dbb4da19640ca205b6e171e69125b685 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 0000000000000000000000000000000000000000..5d11cccfb4a0820895c4d1599a217dcf50dc8c0c
--- /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 8f4363757bb341de8f775f2dca174b6c9602f19a..d12c7004cdc079f3887e81862e9a0c3e56267db8 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 741fce0686de21e239a639746391ccf7efd60497..1cb45af85efe6ceb3f9be80d24f4f84f003d8f7c 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 0000000000000000000000000000000000000000..1026f6aa3cd2fdf1ac2522daee8013c33282d214
--- /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 0000000000000000000000000000000000000000..7dd244d83de9d6ab52d417622825586b9cc4e552
--- /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 0000000000000000000000000000000000000000..31e146580120350c0be56d43942b412cf8fc8b5d
--- /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 0000000000000000000000000000000000000000..1a19293958ee05179c65c8de1738a5a9a9c6f7d4
--- /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 0000000000000000000000000000000000000000..b61f250d8523fe76324e2014d33bf2fa6e2a07d2
--- /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 0000000000000000000000000000000000000000..caf7f7ccfbbd91bfe4dcafa32126971e344c05d2
--- /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 0000000000000000000000000000000000000000..2f7a112477d7d89a4b223906939eefce06ab217d
--- /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 0000000000000000000000000000000000000000..1e3fca3f044d0ae303f3971007d29d9a10840adf
--- /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 61a9d9ac39d987399a4da5bddfcb40cbd1edafa4..0000000000000000000000000000000000000000
--- 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 0000000000000000000000000000000000000000..d6102eaaf66247e94b7265619f830b545f4beb1c
--- /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 0000000000000000000000000000000000000000..5bc40181e62e271077d12aa8728dd49e9e68b57c
--- /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();
+    }
+}