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