Skip to content

Commit

Permalink
hibernate-configuration-hw
Browse files Browse the repository at this point in the history
  • Loading branch information
Nebn1x committed Oct 7, 2024
1 parent ab6cb67 commit 7f1bf94
Show file tree
Hide file tree
Showing 15 changed files with 227 additions and 11 deletions.
10 changes: 10 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,16 @@
</properties>

<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.4.4.Final</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/mate/academy/Main.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,18 @@
package mate.academy;

import mate.academy.lib.Injector;
import mate.academy.model.Movie;
import mate.academy.service.MovieService;

public class Main {
public static void main(String[] args) {
MovieService movieService = (MovieService) Injector.getInstance(MovieService.class);
Movie movie = new Movie();
movie.setTitle("Harry Potter");
movie.setDescription("Nice Movie");

Movie saveMovie = movieService.add(movie);
Movie getMovie = movieService.get(1L);
System.out.println(getMovie);
}
}
12 changes: 12 additions & 0 deletions src/main/java/mate/academy/dao/MovieDao.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package mate.academy.dao;

import java.util.Optional;
import mate.academy.lib.Dao;
import mate.academy.model.Movie;

@Dao
public interface MovieDao {
Movie add(Movie movie);

Optional<Movie> get(Long id);
}
52 changes: 52 additions & 0 deletions src/main/java/mate/academy/dao/impl/MovieDaoImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package mate.academy.dao.impl;

import java.util.Optional;
import mate.academy.dao.MovieDao;
import mate.academy.exeption.DataProcessingException;
import mate.academy.lib.Dao;
import mate.academy.model.Movie;
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.save(movie);
transaction.commit();
return movie;
} catch (Exception e) {
if (transaction != null) {
transaction.rollback();
}
throw new DataProcessingException("Can't add movie: " + movie);
} finally {
if (session != null) {
session.close();
}
}
}

@Override
public Optional<Movie> get(Long id) {
Session session = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
session.get(Movie.class, id);
return Optional.ofNullable(session.get(Movie.class, id));
} catch (Exception e) {
throw new DataProcessingException("Can't get movie by id : " + id);
} finally {
if (session != null) {
session.close();
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package mate.academy.exeption;

public class DataProcessingException extends RuntimeException {
public DataProcessingException(String message) {
super(message);
}
}
3 changes: 3 additions & 0 deletions src/main/java/mate/academy/lib/Dao.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package mate.academy.lib;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Dao {
}
3 changes: 3 additions & 0 deletions src/main/java/mate/academy/lib/Inject.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package mate.academy.lib;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Inject {
}
16 changes: 8 additions & 8 deletions src/main/java/mate/academy/lib/Injector.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@

public class Injector {
private static final Map<String, Injector> injectors = new HashMap<>();
private final Map<Class<?>, Object> instanceOfClasses = new HashMap<>();
private final List<Class<?>> classes = new ArrayList<>();
private static final Map<Class<?>, Object> instanceOfClasses = new HashMap<>();
private static final List<Class<?>> classes = new ArrayList<>();

private Injector(String mainPackageName) {
try {
Expand All @@ -33,7 +33,7 @@ public static Injector getInstance(String mainPackageName) {
return injector;
}

public Object getInstance(Class<?> certainInterface) {
public static Object getInstance(Class<?> certainInterface) {
Object newInstanceOfClass = null;
Class<?> clazz = findClassExtendingInterface(certainInterface);
Object instanceOfCurrentClass = createInstance(clazz);
Expand All @@ -57,7 +57,7 @@ public Object getInstance(Class<?> certainInterface) {
return newInstanceOfClass;
}

private Class<?> findClassExtendingInterface(Class<?> certainInterface) {
private static Class<?> findClassExtendingInterface(Class<?> certainInterface) {
for (Class<?> clazz : classes) {
Class<?>[] interfaces = clazz.getInterfaces();
for (Class<?> singleInterface : interfaces) {
Expand All @@ -73,7 +73,7 @@ private Class<?> findClassExtendingInterface(Class<?> certainInterface) {
+ " interface and has valid annotation (Dao or Service)");
}

private Object getNewInstance(Class<?> certainClass) {
private static Object getNewInstance(Class<?> certainClass) {
if (instanceOfClasses.containsKey(certainClass)) {
return instanceOfClasses.get(certainClass);
}
Expand All @@ -82,7 +82,7 @@ private Object getNewInstance(Class<?> certainClass) {
return newInstance;
}

private boolean isFieldInitialized(Field field, Object instance) {
private static boolean isFieldInitialized(Field field, Object instance) {
field.setAccessible(true);
try {
return field.get(instance) != null;
Expand All @@ -91,7 +91,7 @@ private boolean isFieldInitialized(Field field, Object instance) {
}
}

private Object createInstance(Class<?> clazz) {
private static Object createInstance(Class<?> clazz) {
Object newInstance;
try {
Constructor<?> classConstructor = clazz.getConstructor();
Expand All @@ -102,7 +102,7 @@ private Object createInstance(Class<?> clazz) {
return newInstance;
}

private void setValueToField(Field field, Object instanceOfClass, Object classToInject) {
private static void setValueToField(Field field, Object instanceOfClass, Object classToInject) {
try {
field.setAccessible(true);
field.set(instanceOfClass, classToInject);
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/mate/academy/lib/Service.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package mate.academy.lib;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Service {
}
42 changes: 42 additions & 0 deletions src/main/java/mate/academy/model/Movie.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package mate.academy.model;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import mate.academy.lib.Inject;

@Entity
@Inject
public class Movie {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String title;
private String description;

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;
}

}
11 changes: 11 additions & 0 deletions src/main/java/mate/academy/service/MovieService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package mate.academy.service;

import mate.academy.lib.Service;
import mate.academy.model.Movie;

@Service
public interface MovieService {
Movie add(Movie movie);

Movie get(Long id);
}
22 changes: 22 additions & 0 deletions src/main/java/mate/academy/service/imlp/MovieServiceImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package mate.academy.service.imlp;

import mate.academy.dao.MovieDao;
import mate.academy.lib.Injector;
import mate.academy.lib.Service;
import mate.academy.model.Movie;
import mate.academy.service.MovieService;

@Service
public class MovieServiceImpl implements MovieService {
private MovieDao movieDao = (MovieDao) Injector.getInstance(MovieDao.class);

@Override
public Movie add(Movie movie) {
return movieDao.add(movie);
}

@Override
public Movie get(Long id) {
return movieDao.get(id).orElse(null);
}
}
19 changes: 19 additions & 0 deletions src/main/java/mate/academy/util/HibernateUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package mate.academy.util;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
private static SessionFactory instance = getSessionFactory();

private HibernateUtil() {
}

public static SessionFactory initSessionFactory() {
return new Configuration().configure().buildSessionFactory();
}

public static SessionFactory getSessionFactory() {
return instance;
}
}
18 changes: 18 additions & 0 deletions src/main/resources/hibernate.cfg.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>
<property name="connection.url">jdbc:mysql://localhost:3306</property>
<property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">qwerty123</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>

<mapping class="mate.academy.model.Movie"/>
</session-factory>
</hibernate-configuration>
9 changes: 6 additions & 3 deletions src/test/resources/hibernate.cfg.xml
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:mysql://localhost:3306</property>
<property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
<property name="connection.url">jdbc:hsqldb:mem</property>
<property name="connection.username">sa</property>
<property name="connection.password"/>
<property name="connection.username">root</property>
<property name="connection.password">qwerty123</property>
<property name="dialect">org.hibernate.dialect.HSQLDialect</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">create-drop</property>

<mapping class="mate.academy.model.Movie"/>
</session-factory>
</hibernate-configuration>

0 comments on commit 7f1bf94

Please sign in to comment.