diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..f66f690
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,38 @@
+services:
+ mysql:
+ image: mysql:8.3
+ container_name: mysql
+
+ environment:
+ MYSQL_ROOT_PASSWORD: root
+ MYSQL_DATABASE: testdb
+ MYSQL_USER: user
+ MYSQL_PASSWORD: password
+ # ports:
+ # - "3306:3306"
+ volumes:
+ - mysql_data:/var/lib/mysql
+
+ app:
+ build: ./hibernate-projet
+ container_name: app
+ depends_on:
+ - mysql
+ restart: on-failure
+ environment:
+ DB_HOST: mysql
+ DB_PORT: 3306
+ DB_NAME: testdb
+ DB_USER: user
+ DB_PASSWORD: password
+
+
+
+
+
+volumes:
+ mysql_data:
+
+
+
+
diff --git a/hibernate-project/Dockerfile b/hibernate-project/Dockerfile
new file mode 100644
index 0000000..1c59bed
--- /dev/null
+++ b/hibernate-project/Dockerfile
@@ -0,0 +1,16 @@
+FROM maven:3.9.6-eclipse-temurin-17 AS build
+
+WORKDIR /app
+
+COPY pom.xml .
+RUN mvn dependency:go-offline -B
+COPY src ./src
+RUN mvn package -DskipTests
+
+FROM eclipse-temurin:17-jre-alpine
+WORKDIR /app
+COPY --from=build /app/target/hibernate-projet-1.0-SNAPSHOT.jar app.jar
+ENTRYPOINT [ "java", "-jar", "app.jar" ]
+
+# java -jar app.jar
+
diff --git a/hibernate-project/pom.xml b/hibernate-project/pom.xml
new file mode 100644
index 0000000..4dfb7b6
--- /dev/null
+++ b/hibernate-project/pom.xml
@@ -0,0 +1,150 @@
+
+
+ 4.0.0
+
+ com.humanbooster
+ hibernate-project
+ 1.0-SNAPSHOT
+
+
+ 21
+ 21
+ UTF-8
+
+
+
+
+
+ org.junit
+ junit-bom
+ 5.11.0
+ pom
+ import
+
+
+ org.hibernate.orm
+ hibernate-platform
+ 6.6.13.Final
+ pom
+ import
+
+
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ test
+
+
+
+ org.junit.jupiter
+ junit-jupiter-params
+ test
+
+
+ org.hibernate.orm
+ hibernate-core
+
+
+ jakarta.transaction
+ jakarta.transaction-api
+
+
+ jakarta.persistence
+ jakarta.persistence-api
+
+
+ com.mysql
+ mysql-connector-j
+ 9.3.0
+
+
+ org.jetbrains
+ annotations
+ RELEASE
+ compile
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 3.5.2
+
+
+ package
+
+ shade
+
+
+
+
+ com.exemple.App
+
+
+
+
+
+
+
+
+
+
+
+ maven-clean-plugin
+ 3.4.0
+
+
+
+ maven-resources-plugin
+ 3.3.1
+
+
+ maven-compiler-plugin
+ 3.13.0
+
+
+ maven-surefire-plugin
+ 3.3.0
+
+
+ maven-jar-plugin
+ 3.4.2
+
+
+
+ true
+ com.exemple.App
+
+
+
+
+
+ maven-install-plugin
+ 3.1.2
+
+
+ maven-deploy-plugin
+ 3.1.2
+
+
+
+ maven-site-plugin
+ 3.12.1
+
+
+ maven-project-info-reports-plugin
+ 3.6.1
+
+
+
+
+
diff --git a/hibernate-project/src/main/java/com/humanbooster/App.java b/hibernate-project/src/main/java/com/humanbooster/App.java
new file mode 100644
index 0000000..a7b514c
--- /dev/null
+++ b/hibernate-project/src/main/java/com/humanbooster/App.java
@@ -0,0 +1,39 @@
+package com.humanbooster;
+
+import com.humanbooster.dao.UserDao;
+import com.humanbooster.model.Article;
+import com.humanbooster.model.User;
+import com.humanbooster.service.UserService;
+import org.hibernate.SessionFactory;
+import org.hibernate.boot.Metadata;
+import org.hibernate.boot.MetadataSources;
+import org.hibernate.boot.registry.StandardServiceRegistry;
+import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
+
+import java.util.List;
+
+public class App {
+ public static void main(String[] args) {
+ System.out.println("Démarrage de l'application");
+
+ StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
+ .configure()
+ .build();
+
+ Metadata metadata = new MetadataSources(registry).buildMetadata();
+ SessionFactory sessionFactory = metadata.buildSessionFactory();
+ System.out.println("Connexion réussie !");
+
+ User user = new User("Bob", "bob@example.com", List.of(
+ new Article("Article 1", "Contenu de l'article 1", null),
+ new Article("Article 2", "Contenu de l'article 2", null)
+ ));
+
+ UserService userService = new UserService(new UserDao(sessionFactory));
+
+ List existingUsers = userService.getAllUsers();
+ existingUsers.forEach(u -> userService.deleteUser(u.getId()));
+
+ userService.createUser(user);
+ }
+}
\ No newline at end of file
diff --git a/hibernate-project/src/main/java/com/humanbooster/dao/ArticleDto.java b/hibernate-project/src/main/java/com/humanbooster/dao/ArticleDto.java
new file mode 100644
index 0000000..5353347
--- /dev/null
+++ b/hibernate-project/src/main/java/com/humanbooster/dao/ArticleDto.java
@@ -0,0 +1,34 @@
+package com.humanbooster.dao;
+
+import com.humanbooster.model.Article;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+
+public class ArticleDto extends GenericDaoImpl {
+
+ public ArticleDto(SessionFactory sessionFactory, Class entityClass) {
+ super(sessionFactory, entityClass);
+ }
+
+ public Article findByAuthor(String author) {
+ try(Session session = sessionFactory.openSession()){
+ session.beginTransaction();
+ Article article = session.createQuery("FROM Article WHERE author = :author", Article.class)
+ .setParameter("author", author)
+ .uniqueResult();
+ session.getTransaction().commit();
+ return article;
+ }
+ }
+
+ public Article findByTitle(String title) {
+ try(Session session = sessionFactory.openSession()){
+ session.beginTransaction();
+ Article article = session.createQuery("FROM Article WHERE title = :title", Article.class)
+ .setParameter("title", title)
+ .uniqueResult();
+ session.getTransaction().commit();
+ return article;
+ }
+ }
+}
diff --git a/hibernate-project/src/main/java/com/humanbooster/dao/GenericDao.java b/hibernate-project/src/main/java/com/humanbooster/dao/GenericDao.java
new file mode 100644
index 0000000..fe59aa4
--- /dev/null
+++ b/hibernate-project/src/main/java/com/humanbooster/dao/GenericDao.java
@@ -0,0 +1,11 @@
+package com.humanbooster.dao;
+
+import java.util.List;
+
+public interface GenericDao {
+ void create(T entity);
+ T read(ID id);
+ void update(T entity);
+ void delete(ID id);
+ List findAll();
+}
diff --git a/hibernate-project/src/main/java/com/humanbooster/dao/GenericDaoImpl.java b/hibernate-project/src/main/java/com/humanbooster/dao/GenericDaoImpl.java
new file mode 100644
index 0000000..adf2a06
--- /dev/null
+++ b/hibernate-project/src/main/java/com/humanbooster/dao/GenericDaoImpl.java
@@ -0,0 +1,65 @@
+package com.humanbooster.dao;
+
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+
+import java.util.List;
+
+public abstract class GenericDaoImpl implements GenericDao {
+
+ private final Class entityClass;
+ protected SessionFactory sessionFactory;
+
+ public GenericDaoImpl(SessionFactory sessionFactory, Class entityClass) {
+ this.sessionFactory = sessionFactory;
+ this.entityClass = entityClass;
+ }
+
+ @Override
+ public void create(T entity) {
+ try (Session session = sessionFactory.openSession()) {
+ session.beginTransaction();
+ session.persist(entity);
+ session.getTransaction().commit();
+ }
+ }
+
+ @Override
+ public T read(ID id) {
+ try (Session session = sessionFactory.openSession()) {
+ session.beginTransaction();
+ T entity = session.get(entityClass, id);
+ session.getTransaction().commit();
+ return entity;
+ }
+ }
+
+ @Override
+ public void update(T entity) {
+ try (Session session = sessionFactory.openSession()) {
+ session.beginTransaction();
+ session.merge(entity);
+ session.getTransaction().commit();
+ }
+ }
+
+ @Override
+ public void delete(ID id) {
+ try (Session session = sessionFactory.openSession()) {
+ session.beginTransaction();
+ T entity = session.get(entityClass, id);
+ if (entity != null) session.remove(entity);
+ session.getTransaction().commit();
+ }
+ }
+
+ @Override
+ public List findAll() {
+ try (Session session = sessionFactory.openSession()) {
+ session.beginTransaction();
+ List entities = session.createQuery("from " + entityClass.getName(), entityClass).list();
+ session.getTransaction().commit();
+ return entities;
+ }
+ }
+}
diff --git a/hibernate-project/src/main/java/com/humanbooster/dao/UserDao.java b/hibernate-project/src/main/java/com/humanbooster/dao/UserDao.java
new file mode 100644
index 0000000..a01eb6d
--- /dev/null
+++ b/hibernate-project/src/main/java/com/humanbooster/dao/UserDao.java
@@ -0,0 +1,23 @@
+package com.humanbooster.dao;
+
+import com.humanbooster.model.User;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+
+public class UserDao extends GenericDaoImpl {
+
+ public UserDao(SessionFactory sessionFactory) {
+ super(sessionFactory, entityClass);
+ }
+
+ public User findByEmail(String email) {
+ try(Session session = sessionFactory.openSession()){
+ session.beginTransaction();
+ User user = session.createQuery("FROM User WHERE email = :email", User.class)
+ .setParameter("email", email)
+ .uniqueResult();
+ session.getTransaction().commit();
+ return user;
+ }
+ }
+}
diff --git a/hibernate-project/src/main/java/com/humanbooster/model/Article.java b/hibernate-project/src/main/java/com/humanbooster/model/Article.java
new file mode 100644
index 0000000..b33c235
--- /dev/null
+++ b/hibernate-project/src/main/java/com/humanbooster/model/Article.java
@@ -0,0 +1,59 @@
+package com.humanbooster.model;
+
+import jakarta.persistence.*;
+
+@Entity
+public class Article {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ @Column(name = "title", nullable = false, length = 100)
+ private String title;
+
+ @Column(name = "content", nullable = false)
+ private String content;
+
+ @ManyToOne
+ @JoinColumn(name="author_id", nullable=false)
+ private User author;
+
+ public Article (String titre, String content, User author){
+ this.title = title;
+ this.content = content;
+ this.author = author;
+ }
+
+ 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 getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ public User getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(User author) {
+ this.author = author;
+ }
+}
diff --git a/hibernate-project/src/main/java/com/humanbooster/model/User.java b/hibernate-project/src/main/java/com/humanbooster/model/User.java
new file mode 100644
index 0000000..fd561a6
--- /dev/null
+++ b/hibernate-project/src/main/java/com/humanbooster/model/User.java
@@ -0,0 +1,57 @@
+package com.humanbooster.model;
+
+import jakarta.persistence.*;
+
+import java.util.List;
+
+@Entity
+public class User {
+
+ @Id
+ @GeneratedValue (strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ private String name;
+ private String email;
+
+ @OneToMany(mappedBy="author", cascade= CascadeType.ALL, fetch = FetchType.LAZY)
+ private List articles;
+
+ public User(String name, String email, List articles) {
+ this.name = name;
+ this.email = email;
+ this.articles = articles;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public List getArticles() {
+ return articles;
+ }
+
+ public void setArticles(List articles) {
+ this.articles = articles;
+ }
+}
diff --git a/hibernate-project/src/main/java/com/humanbooster/service/ArticleService.java b/hibernate-project/src/main/java/com/humanbooster/service/ArticleService.java
new file mode 100644
index 0000000..703c7ae
--- /dev/null
+++ b/hibernate-project/src/main/java/com/humanbooster/service/ArticleService.java
@@ -0,0 +1,43 @@
+package com.humanbooster.service;
+
+import com.humanbooster.dao.ArticleDto;
+import com.humanbooster.model.Article;
+
+import java.util.List;
+
+public class ArticleService {
+
+ public final ArticleDto articleDto;
+
+ public ArticleService(ArticleDto articleDto) {
+ this.articleDto = articleDto;
+ }
+
+ public void createArticle(Article article) {
+ articleDto.create(article);
+ }
+
+ public void getArticleById(Long id) {
+ articleDto.read(id);
+ }
+
+ public void updateArticle(Article article) {
+ articleDto.update(article);
+ }
+
+ public void deleteArticle(Long id) {
+ articleDto.delete(id);
+ }
+
+ public List getAllArticles() {
+ return articleDto.findAll();
+ }
+
+ public Article findArticleByAuthor(String author) {
+ return articleDto.findByAuthor(author);
+ }
+
+ public Article findArticleByTitle(String title) {
+ return articleDto.findByTitle(title);
+ }
+}
diff --git a/hibernate-project/src/main/java/com/humanbooster/service/UserService.java b/hibernate-project/src/main/java/com/humanbooster/service/UserService.java
new file mode 100644
index 0000000..e78cd1e
--- /dev/null
+++ b/hibernate-project/src/main/java/com/humanbooster/service/UserService.java
@@ -0,0 +1,39 @@
+package com.humanbooster.service;
+
+import com.humanbooster.dao.UserDao;
+import com.humanbooster.model.User;
+
+import java.util.List;
+
+public class UserService {
+
+ private final UserDao userDao;
+
+ public UserService(UserDao userDao) {
+ this.userDao = userDao;
+ }
+
+ public void createUser(User user) {
+ userDao.create(user);
+ }
+
+ public void getUserById(Long id) {
+ userDao.read(id);
+ }
+
+ public void updateUser(User user) {
+ userDao.update(user);
+ }
+
+ public void deleteUser(Long id) {
+ userDao.delete(id);
+ }
+
+ public List getAllUsers() {
+ return userDao.findAll();
+ }
+
+ public User findUserByEmail(String email) {
+ return userDao.findByEmail(email);
+ }
+}
diff --git a/hibernate-project/src/main/resources/hibernate.cfg.xml b/hibernate-project/src/main/resources/hibernate.cfg.xml
new file mode 100644
index 0000000..ee58ec3
--- /dev/null
+++ b/hibernate-project/src/main/resources/hibernate.cfg.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+ com.mysql.cj.jdbc.Driver
+ jdbc:mysql://mysql:3306/testdb?useSSL=false&allowPublicKeyRetrieval=true
+ root
+ root
+
+ org.hibernate.dialect.MySQLDialect
+ update
+
+
+ true
+ true
+
+
+
+
\ No newline at end of file