diff --git a/mem.log b/mem.log
new file mode 100644
index 000000000..e69de29bb
diff --git a/mem.properties b/mem.properties
new file mode 100644
index 000000000..baae27427
--- /dev/null
+++ b/mem.properties
@@ -0,0 +1,5 @@
+#HSQL Database Engine 2.7.3
+#Tue Jul 30 15:42:21 CEST 2024
+modified=no
+tx_timestamp=28
+version=2.7.3
diff --git a/mem.script b/mem.script
new file mode 100644
index 000000000..634d6dd92
--- /dev/null
+++ b/mem.script
@@ -0,0 +1,46 @@
+SET DATABASE UNIQUE NAME HSQLDB9103D6CAF3
+SET DATABASE DEFAULT RESULT MEMORY ROWS 0
+SET DATABASE EVENT LOG LEVEL 0
+SET DATABASE TRANSACTION CONTROL LOCKS
+SET DATABASE DEFAULT ISOLATION LEVEL READ COMMITTED
+SET DATABASE TRANSACTION ROLLBACK ON CONFLICT TRUE
+SET DATABASE TEXT TABLE DEFAULTS ''
+SET DATABASE SQL NAMES FALSE
+SET DATABASE SQL RESTRICT EXEC FALSE
+SET DATABASE SQL REFERENCES FALSE
+SET DATABASE SQL SIZE TRUE
+SET DATABASE SQL TYPES FALSE
+SET DATABASE SQL TDC DELETE TRUE
+SET DATABASE SQL TDC UPDATE TRUE
+SET DATABASE SQL SYS INDEX NAMES TRUE
+SET DATABASE SQL CONCAT NULLS TRUE
+SET DATABASE SQL UNIQUE NULLS TRUE
+SET DATABASE SQL CONVERT TRUNCATE TRUE
+SET DATABASE SQL AVG SCALE 0
+SET DATABASE SQL DOUBLE NAN TRUE
+SET FILES WRITE DELAY 500 MILLIS
+SET FILES BACKUP INCREMENT TRUE
+SET FILES CACHE SIZE 10000
+SET FILES CACHE ROWS 50000
+SET FILES SCALE 32
+SET FILES LOB SCALE 32
+SET FILES DEFRAG 0
+SET FILES NIO TRUE
+SET FILES NIO SIZE 256
+SET FILES LOG TRUE
+SET FILES LOG SIZE 50
+SET FILES CHECK 28
+SET DATABASE COLLATION "SQL_TEXT" PAD SPACE
+CREATE USER SA PASSWORD DIGEST 'd41d8cd98f00b204e9800998ecf8427e'
+ALTER USER SA SET LOCAL TRUE
+CREATE SCHEMA PUBLIC AUTHORIZATION DBA
+ALTER SEQUENCE SYSTEM_LOBS.LOB_ID RESTART WITH 1
+SET DATABASE DEFAULT INITIAL SCHEMA PUBLIC
+GRANT USAGE ON DOMAIN INFORMATION_SCHEMA.CARDINAL_NUMBER TO PUBLIC
+GRANT USAGE ON DOMAIN INFORMATION_SCHEMA.YES_OR_NO TO PUBLIC
+GRANT USAGE ON DOMAIN INFORMATION_SCHEMA.CHARACTER_DATA TO PUBLIC
+GRANT USAGE ON DOMAIN INFORMATION_SCHEMA.SQL_IDENTIFIER TO PUBLIC
+GRANT USAGE ON DOMAIN INFORMATION_SCHEMA.TIME_STAMP TO PUBLIC
+GRANT DBA TO SA
+SET SCHEMA SYSTEM_LOBS
+INSERT INTO BLOCKS VALUES(0,2147483647,0)
diff --git a/pom.xml b/pom.xml
index f2dbc0637..707b80338 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,6 +20,17 @@
+
+ org.hibernate.orm
+ hibernate-core
+ 6.5.2.Final
+
+
+ com.mysql
+ mysql-connector-j
+ 9.0.0
+
+
org.apache.commons
commons-lang3
@@ -28,7 +39,7 @@
junit
junit
- 4.12
+ 4.13.2
test
@@ -46,7 +57,7 @@
org.hsqldb
hsqldb
- 2.3.4
+ 2.7.3
diff --git a/src/main/java/mate/academy/dao/MovieDao.java b/src/main/java/mate/academy/dao/MovieDao.java
new file mode 100644
index 000000000..05a4541c6
--- /dev/null
+++ b/src/main/java/mate/academy/dao/MovieDao.java
@@ -0,0 +1,10 @@
+package mate.academy.dao;
+
+import java.util.Optional;
+import mate.academy.entity.Movie;
+
+public interface MovieDao {
+ Movie add(Movie movie);
+
+ Optional get(Long id);
+}
diff --git a/src/main/java/mate/academy/dao/MovieDaoImpl.java b/src/main/java/mate/academy/dao/MovieDaoImpl.java
new file mode 100644
index 000000000..181d0a051
--- /dev/null
+++ b/src/main/java/mate/academy/dao/MovieDaoImpl.java
@@ -0,0 +1,43 @@
+package mate.academy.dao;
+
+import java.util.Optional;
+import mate.academy.entity.Movie;
+import mate.academy.exception.DataProcessingException;
+import mate.academy.lib.Dao;
+import mate.academy.util.HibernateUtil;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+
+@Dao
+public class MovieDaoImpl implements MovieDao {
+ @Override
+ public Movie add(Movie movie) {
+ Session session = null;
+ Transaction transaction = null;
+ try {
+ session = HibernateUtil.getSessionFactory().openSession();
+ transaction = session.beginTransaction();
+ session.persist(movie);
+ transaction.commit();
+ } catch (Exception e) {
+ if (transaction != null) {
+ transaction.rollback();
+ }
+ throw new DataProcessingException("Can't add new movie: " + movie, e);
+ } finally {
+ if (session != null) {
+ session.close();
+ }
+ }
+ return movie;
+ }
+
+ @Override
+ public Optional get(Long id) {
+ try (Session session = HibernateUtil.getSessionFactory().openSession()) {
+ return Optional.ofNullable(session.get(Movie.class, id));
+ } catch (Exception e) {
+ throw new DataProcessingException("Can't find movie by id: " + id, e);
+ }
+ }
+}
diff --git a/src/main/java/mate/academy/entity/Movie.java b/src/main/java/mate/academy/entity/Movie.java
new file mode 100644
index 000000000..438e562c8
--- /dev/null
+++ b/src/main/java/mate/academy/entity/Movie.java
@@ -0,0 +1,57 @@
+package mate.academy.entity;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+
+@Entity
+public class Movie {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+ private String title;
+ private String description;
+
+ public Movie(Long id, String title, String description) {
+ this.id = id;
+ this.title = title;
+ this.description = description;
+ }
+
+ public Movie() {
+ }
+
+ 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 String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ @Override
+ public String toString() {
+ return "Movie{"
+ + "id=" + id
+ + ", title='" + title + '\''
+ + ", description='" + description + '\''
+ + '}';
+ }
+}
diff --git a/src/main/java/mate/academy/exception/DataProcessingException.java b/src/main/java/mate/academy/exception/DataProcessingException.java
new file mode 100644
index 000000000..63b937dc4
--- /dev/null
+++ b/src/main/java/mate/academy/exception/DataProcessingException.java
@@ -0,0 +1,7 @@
+package mate.academy.exception;
+
+public class DataProcessingException extends RuntimeException {
+ public DataProcessingException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/src/main/java/mate/academy/service/MovieService.java b/src/main/java/mate/academy/service/MovieService.java
new file mode 100644
index 000000000..c8e5ba4c6
--- /dev/null
+++ b/src/main/java/mate/academy/service/MovieService.java
@@ -0,0 +1,9 @@
+package mate.academy.service;
+
+import mate.academy.entity.Movie;
+
+public interface MovieService {
+ Movie add(Movie movie);
+
+ Movie get(Long id);
+}
diff --git a/src/main/java/mate/academy/service/MovieServiceImpl.java b/src/main/java/mate/academy/service/MovieServiceImpl.java
new file mode 100644
index 000000000..729d4fa11
--- /dev/null
+++ b/src/main/java/mate/academy/service/MovieServiceImpl.java
@@ -0,0 +1,22 @@
+package mate.academy.service;
+
+import mate.academy.dao.MovieDao;
+import mate.academy.entity.Movie;
+import mate.academy.lib.Inject;
+import mate.academy.lib.Service;
+
+@Service
+public class MovieServiceImpl implements MovieService {
+ @Inject
+ private MovieDao movieDao;
+
+ @Override
+ public Movie add(Movie movie) {
+ return movieDao.add(movie);
+ }
+
+ @Override
+ public Movie get(Long id) {
+ return movieDao.get(id).orElse(null);
+ }
+}
diff --git a/src/main/java/mate/academy/util/HibernateUtil.java b/src/main/java/mate/academy/util/HibernateUtil.java
new file mode 100644
index 000000000..7a965c6be
--- /dev/null
+++ b/src/main/java/mate/academy/util/HibernateUtil.java
@@ -0,0 +1,34 @@
+package mate.academy.util;
+
+import mate.academy.entity.Movie;
+import mate.academy.exception.DataProcessingException;
+import org.hibernate.SessionFactory;
+import org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy;
+import org.hibernate.cfg.Configuration;
+
+public class HibernateUtil {
+ private static final SessionFactory sessionFactory = initSessionFactory();
+
+ private HibernateUtil() {
+ }
+
+ private static SessionFactory initSessionFactory() {
+ try {
+ return buildConfiguration().buildSessionFactory();
+ } catch (Exception e) {
+ throw new DataProcessingException("Can't create session factory", e);
+ }
+ }
+
+ private static Configuration buildConfiguration() {
+ Configuration configuration = new Configuration();
+ configuration.setPhysicalNamingStrategy(new CamelCaseToUnderscoresNamingStrategy());
+ configuration.addAnnotatedClass(Movie.class);
+ configuration.configure();
+ return configuration;
+ }
+
+ public static SessionFactory getSessionFactory() {
+ return sessionFactory;
+ }
+}
diff --git a/src/main/resources/hibernate.cfg.xml b/src/main/resources/hibernate.cfg.xml
new file mode 100644
index 000000000..5ee33306b
--- /dev/null
+++ b/src/main/resources/hibernate.cfg.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ org.hibernate.dialect.MySQLDialect
+ jdbc:mysql://localhost:3306/ticket_app
+ com.mysql.cj.jdbc.Driver
+ root
+ 11111
+ true
+ create-drop
+
+
\ No newline at end of file