Switch from `EntityManager` to `EntityManagerFactory` across repositories, managers, and services for improved resource management and thread safety.
This commit is contained in:
parent
32fff9c725
commit
f70c1e1d94
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
.createQuery("SELECT g FROM Genre g ORDER BY g.name", Genre.class)
|
try {
|
||||||
.getResultList();
|
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<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();
|
||||||
return Optional.ofNullable(genre);
|
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) {
|
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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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<>();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue