From f70c1e1d947f3bd3ed5863018312cd7650e22373 Mon Sep 17 00:00:00 2001 From: Gustavo Henrique Santos Souza de Miranda Date: Sat, 29 Nov 2025 03:02:49 -0300 Subject: [PATCH] Switch from `EntityManager` to `EntityManagerFactory` across repositories, managers, and services for improved resource management and thread safety. --- .../mediamanager/MediaManagerApplication.java | 2 +- .../repository/GenreRepository.java | 64 ++++++++++++------- .../service/database/DatabaseManager.java | 15 +---- .../delegate/DelegateActionManager.java | 10 +-- 4 files changed, 50 insertions(+), 41 deletions(-) diff --git a/src/main/java/com/mediamanager/MediaManagerApplication.java b/src/main/java/com/mediamanager/MediaManagerApplication.java index 3a85f6f..22834fb 100644 --- a/src/main/java/com/mediamanager/MediaManagerApplication.java +++ b/src/main/java/com/mediamanager/MediaManagerApplication.java @@ -60,7 +60,7 @@ public class MediaManagerApplication { default: } databaseManager.init(); - actionManager = new DelegateActionManager(databaseManager.getEntityManager()); + actionManager = new DelegateActionManager(databaseManager.getEntityManagerFactory()); actionManager.start(); ipcManager = new IPCManager(config,actionManager); ipcManager.init(); diff --git a/src/main/java/com/mediamanager/repository/GenreRepository.java b/src/main/java/com/mediamanager/repository/GenreRepository.java index 6279caa..73e9be9 100644 --- a/src/main/java/com/mediamanager/repository/GenreRepository.java +++ b/src/main/java/com/mediamanager/repository/GenreRepository.java @@ -2,6 +2,7 @@ package com.mediamanager.repository; import com.mediamanager.model.Genre; import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -15,10 +16,10 @@ import java.util.Optional; public class GenreRepository { private static final Logger logger = LogManager.getLogger(GenreRepository.class); - private final EntityManager entityManager; + private final EntityManagerFactory entityManagerFactory; - public GenreRepository(EntityManager entityManager) { - this.entityManager = entityManager; + public GenreRepository(EntityManagerFactory entityManagerFactory) { + this.entityManagerFactory = entityManagerFactory; } /** @@ -26,16 +27,19 @@ public class GenreRepository { */ public Genre save(Genre genre) { logger.debug("Saving genre: {}", genre.getName()); - entityManager.getTransaction().begin(); + EntityManager em = entityManagerFactory.createEntityManager(); + em.getTransaction().begin(); try { - entityManager.persist(genre); - entityManager.getTransaction().commit(); + em.persist(genre); + em.getTransaction().commit(); logger.debug("Genre saved with ID: {}", genre.getId()); return genre; } catch (Exception e) { - entityManager.getTransaction().rollback(); + em.getTransaction().rollback(); logger.error("Error saving genre", e); throw e; + } finally { + if (em.isOpen()) em.close(); } } @@ -44,9 +48,14 @@ public class GenreRepository { */ public List findAll() { logger.debug("Finding all genres"); - return entityManager - .createQuery("SELECT g FROM Genre g ORDER BY g.name", Genre.class) - .getResultList(); + EntityManager em = entityManagerFactory.createEntityManager(); + try { + return em + .createQuery("SELECT g FROM Genre g ORDER BY g.name", Genre.class) + .getResultList(); + } finally { + if (em.isOpen()) em.close(); + } } /** @@ -54,8 +63,13 @@ public class GenreRepository { */ public Optional findById(Integer id) { logger.debug("Finding genre by ID: {}", id); - Genre genre = entityManager.find(Genre.class, id); - return Optional.ofNullable(genre); + EntityManager em = entityManagerFactory.createEntityManager(); + try { + Genre genre = em.find(Genre.class, id); + return Optional.ofNullable(genre); + } finally { + if (em.isOpen()) em.close(); + } } /** @@ -63,16 +77,19 @@ public class GenreRepository { */ public Genre update(Genre genre) { logger.debug("Updating genre ID: {}", genre.getId()); - entityManager.getTransaction().begin(); + EntityManager em = entityManagerFactory.createEntityManager(); + em.getTransaction().begin(); try { - Genre updated = entityManager.merge(genre); - entityManager.getTransaction().commit(); + Genre updated = em.merge(genre); + em.getTransaction().commit(); logger.debug("Genre updated successfully"); return updated; } catch (Exception e) { - entityManager.getTransaction().rollback(); + em.getTransaction().rollback(); logger.error("Error updating genre", e); throw e; + } finally { + if (em.isOpen()) em.close(); } } @@ -81,21 +98,24 @@ public class GenreRepository { */ public boolean deleteById(Integer id) { logger.debug("Deleting genre by ID: {}", id); - entityManager.getTransaction().begin(); + EntityManager em = entityManagerFactory.createEntityManager(); + em.getTransaction().begin(); try { - Genre genre = entityManager.find(Genre.class, id); + Genre genre = em.find(Genre.class, id); if (genre == null) { - entityManager.getTransaction().rollback(); + em.getTransaction().rollback(); return false; } - entityManager.remove(genre); - entityManager.getTransaction().commit(); + em.remove(genre); + em.getTransaction().commit(); logger.debug("Genre deleted successfully"); return true; } catch (Exception e) { - entityManager.getTransaction().rollback(); + em.getTransaction().rollback(); logger.error("Error deleting genre", e); throw e; + } finally { + if (em.isOpen()) em.close(); } } } \ No newline at end of file diff --git a/src/main/java/com/mediamanager/service/database/DatabaseManager.java b/src/main/java/com/mediamanager/service/database/DatabaseManager.java index 2d9c7eb..13188a0 100644 --- a/src/main/java/com/mediamanager/service/database/DatabaseManager.java +++ b/src/main/java/com/mediamanager/service/database/DatabaseManager.java @@ -1,6 +1,5 @@ package com.mediamanager.service.database; -import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -20,7 +19,6 @@ public abstract class DatabaseManager { protected Connection connection; protected String connectionUrl; protected EntityManagerFactory entityManagerFactory; - protected EntityManager entityManager; protected static final Logger logger = LogManager.getLogger(DatabaseManager.class); public DatabaseManager(Properties config) { @@ -48,14 +46,6 @@ public abstract class DatabaseManager { } public void close() { - if (entityManager != null && entityManager.isOpen()) { - try { - entityManager.close(); - logger.info("EntityManager closed"); - } catch (Exception e) { - logger.error("Error closing EntityManager: {}", e.getMessage()); - } - } if (entityManagerFactory != null && entityManagerFactory.isOpen()) { try { entityManagerFactory.close(); @@ -138,7 +128,6 @@ public abstract class DatabaseManager { try { entityManagerFactory = hibernateConfig.buildSessionFactory().unwrap(EntityManagerFactory.class); - entityManager = entityManagerFactory.createEntityManager(); } catch (Exception e) { logger.error("Failed to initialize Hibernate: {}", e.getMessage()); throw new RuntimeException("Hibernate initialization failed", e); @@ -147,7 +136,7 @@ public abstract class DatabaseManager { logger.info("Hibernate ORM initialized successfully"); } - public EntityManager getEntityManager() { - return entityManager; + public EntityManagerFactory getEntityManagerFactory() { + return entityManagerFactory; } } \ No newline at end of file diff --git a/src/main/java/com/mediamanager/service/delegate/DelegateActionManager.java b/src/main/java/com/mediamanager/service/delegate/DelegateActionManager.java index d05de4e..2221236 100644 --- a/src/main/java/com/mediamanager/service/delegate/DelegateActionManager.java +++ b/src/main/java/com/mediamanager/service/delegate/DelegateActionManager.java @@ -8,7 +8,7 @@ import com.mediamanager.service.delegate.handler.EchoHandler; import com.mediamanager.service.delegate.handler.HeartbeatHandler; import com.mediamanager.service.delegate.handler.genre.*; import com.mediamanager.service.genre.GenreService; -import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -19,13 +19,13 @@ public class DelegateActionManager { private static final Logger logger = LogManager.getLogger(DelegateActionManager.class); private final Map handlerRegistry; - private final EntityManager entityManager; + private final EntityManagerFactory entityManagerFactory; private final GenreService genreService; - public DelegateActionManager(EntityManager entityManager) { - this.entityManager = entityManager; + public DelegateActionManager(EntityManagerFactory entityManagerFactory) { + this.entityManagerFactory = entityManagerFactory; - GenreRepository genreRepository = new GenreRepository(entityManager); + GenreRepository genreRepository = new GenreRepository(entityManagerFactory); this.genreService = new GenreService(genreRepository); logger.debug("DelegateActionManager created"); this.handlerRegistry = new HashMap<>();