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