Switch from `EntityManager` to `EntityManagerFactory` across repositories, managers, and services for improved resource management and thread safety.

This commit is contained in:
Gustavo Henrique Santos Souza de Miranda 2025-11-29 03:02:49 -03:00
parent 32fff9c725
commit f70c1e1d94
4 changed files with 50 additions and 41 deletions

View File

@ -60,7 +60,7 @@ public class MediaManagerApplication {
default: default:
} }
databaseManager.init(); databaseManager.init();
actionManager = new DelegateActionManager(databaseManager.getEntityManager()); actionManager = new DelegateActionManager(databaseManager.getEntityManagerFactory());
actionManager.start(); actionManager.start();
ipcManager = new IPCManager(config,actionManager); ipcManager = new IPCManager(config,actionManager);
ipcManager.init(); ipcManager.init();

View File

@ -2,6 +2,7 @@ package com.mediamanager.repository;
import com.mediamanager.model.Genre; import com.mediamanager.model.Genre;
import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@ -15,10 +16,10 @@ import java.util.Optional;
public class GenreRepository { public class GenreRepository {
private static final Logger logger = LogManager.getLogger(GenreRepository.class); private static final Logger logger = LogManager.getLogger(GenreRepository.class);
private final EntityManager entityManager; private final EntityManagerFactory entityManagerFactory;
public GenreRepository(EntityManager entityManager) { public GenreRepository(EntityManagerFactory entityManagerFactory) {
this.entityManager = entityManager; this.entityManagerFactory = entityManagerFactory;
} }
/** /**
@ -26,16 +27,19 @@ public class GenreRepository {
*/ */
public Genre save(Genre genre) { public Genre save(Genre genre) {
logger.debug("Saving genre: {}", genre.getName()); logger.debug("Saving genre: {}", genre.getName());
entityManager.getTransaction().begin(); EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaction().begin();
try { try {
entityManager.persist(genre); em.persist(genre);
entityManager.getTransaction().commit(); em.getTransaction().commit();
logger.debug("Genre saved with ID: {}", genre.getId()); logger.debug("Genre saved with ID: {}", genre.getId());
return genre; return genre;
} catch (Exception e) { } catch (Exception e) {
entityManager.getTransaction().rollback(); em.getTransaction().rollback();
logger.error("Error saving genre", e); logger.error("Error saving genre", e);
throw e; throw e;
} finally {
if (em.isOpen()) em.close();
} }
} }
@ -44,9 +48,14 @@ public class GenreRepository {
*/ */
public List<Genre> findAll() { public List<Genre> findAll() {
logger.debug("Finding all genres"); logger.debug("Finding all genres");
return entityManager EntityManager em = entityManagerFactory.createEntityManager();
try {
return em
.createQuery("SELECT g FROM Genre g ORDER BY g.name", Genre.class) .createQuery("SELECT g FROM Genre g ORDER BY g.name", Genre.class)
.getResultList(); .getResultList();
} finally {
if (em.isOpen()) em.close();
}
} }
/** /**
@ -54,8 +63,13 @@ public class GenreRepository {
*/ */
public Optional<Genre> findById(Integer id) { public Optional<Genre> findById(Integer id) {
logger.debug("Finding genre by ID: {}", id); logger.debug("Finding genre by ID: {}", id);
Genre genre = entityManager.find(Genre.class, id); EntityManager em = entityManagerFactory.createEntityManager();
try {
Genre genre = em.find(Genre.class, id);
return Optional.ofNullable(genre); return Optional.ofNullable(genre);
} finally {
if (em.isOpen()) em.close();
}
} }
/** /**
@ -63,16 +77,19 @@ public class GenreRepository {
*/ */
public Genre update(Genre genre) { public Genre update(Genre genre) {
logger.debug("Updating genre ID: {}", genre.getId()); logger.debug("Updating genre ID: {}", genre.getId());
entityManager.getTransaction().begin(); EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaction().begin();
try { try {
Genre updated = entityManager.merge(genre); Genre updated = em.merge(genre);
entityManager.getTransaction().commit(); em.getTransaction().commit();
logger.debug("Genre updated successfully"); logger.debug("Genre updated successfully");
return updated; return updated;
} catch (Exception e) { } catch (Exception e) {
entityManager.getTransaction().rollback(); em.getTransaction().rollback();
logger.error("Error updating genre", e); logger.error("Error updating genre", e);
throw e; throw e;
} finally {
if (em.isOpen()) em.close();
} }
} }
@ -81,21 +98,24 @@ public class GenreRepository {
*/ */
public boolean deleteById(Integer id) { public boolean deleteById(Integer id) {
logger.debug("Deleting genre by ID: {}", id); logger.debug("Deleting genre by ID: {}", id);
entityManager.getTransaction().begin(); EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaction().begin();
try { try {
Genre genre = entityManager.find(Genre.class, id); Genre genre = em.find(Genre.class, id);
if (genre == null) { if (genre == null) {
entityManager.getTransaction().rollback(); em.getTransaction().rollback();
return false; return false;
} }
entityManager.remove(genre); em.remove(genre);
entityManager.getTransaction().commit(); em.getTransaction().commit();
logger.debug("Genre deleted successfully"); logger.debug("Genre deleted successfully");
return true; return true;
} catch (Exception e) { } catch (Exception e) {
entityManager.getTransaction().rollback(); em.getTransaction().rollback();
logger.error("Error deleting genre", e); logger.error("Error deleting genre", e);
throw e; throw e;
} finally {
if (em.isOpen()) em.close();
} }
} }
} }

View File

@ -1,6 +1,5 @@
package com.mediamanager.service.database; package com.mediamanager.service.database;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.EntityManagerFactory;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@ -20,7 +19,6 @@ public abstract class DatabaseManager {
protected Connection connection; protected Connection connection;
protected String connectionUrl; protected String connectionUrl;
protected EntityManagerFactory entityManagerFactory; protected EntityManagerFactory entityManagerFactory;
protected EntityManager entityManager;
protected static final Logger logger = LogManager.getLogger(DatabaseManager.class); protected static final Logger logger = LogManager.getLogger(DatabaseManager.class);
public DatabaseManager(Properties config) { public DatabaseManager(Properties config) {
@ -48,14 +46,6 @@ public abstract class DatabaseManager {
} }
public void close() { 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()) { if (entityManagerFactory != null && entityManagerFactory.isOpen()) {
try { try {
entityManagerFactory.close(); entityManagerFactory.close();
@ -138,7 +128,6 @@ public abstract class DatabaseManager {
try { try {
entityManagerFactory = hibernateConfig.buildSessionFactory().unwrap(EntityManagerFactory.class); entityManagerFactory = hibernateConfig.buildSessionFactory().unwrap(EntityManagerFactory.class);
entityManager = entityManagerFactory.createEntityManager();
} catch (Exception e) { } catch (Exception e) {
logger.error("Failed to initialize Hibernate: {}", e.getMessage()); logger.error("Failed to initialize Hibernate: {}", e.getMessage());
throw new RuntimeException("Hibernate initialization failed", e); throw new RuntimeException("Hibernate initialization failed", e);
@ -147,7 +136,7 @@ public abstract class DatabaseManager {
logger.info("Hibernate ORM initialized successfully"); logger.info("Hibernate ORM initialized successfully");
} }
public EntityManager getEntityManager() { public EntityManagerFactory getEntityManagerFactory() {
return entityManager; return entityManagerFactory;
} }
} }

View File

@ -8,7 +8,7 @@ import com.mediamanager.service.delegate.handler.EchoHandler;
import com.mediamanager.service.delegate.handler.HeartbeatHandler; import com.mediamanager.service.delegate.handler.HeartbeatHandler;
import com.mediamanager.service.delegate.handler.genre.*; import com.mediamanager.service.delegate.handler.genre.*;
import com.mediamanager.service.genre.GenreService; 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.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@ -19,13 +19,13 @@ public class DelegateActionManager {
private static final Logger logger = LogManager.getLogger(DelegateActionManager.class); private static final Logger logger = LogManager.getLogger(DelegateActionManager.class);
private final Map<String, ActionHandler> handlerRegistry; private final Map<String, ActionHandler> handlerRegistry;
private final EntityManager entityManager; private final EntityManagerFactory entityManagerFactory;
private final GenreService genreService; private final GenreService genreService;
public DelegateActionManager(EntityManager entityManager) { public DelegateActionManager(EntityManagerFactory entityManagerFactory) {
this.entityManager = entityManager; this.entityManagerFactory = entityManagerFactory;
GenreRepository genreRepository = new GenreRepository(entityManager); GenreRepository genreRepository = new GenreRepository(entityManagerFactory);
this.genreService = new GenreService(genreRepository); this.genreService = new GenreService(genreRepository);
logger.debug("DelegateActionManager created"); logger.debug("DelegateActionManager created");
this.handlerRegistry = new HashMap<>(); this.handlerRegistry = new HashMap<>();