En principio no hay ningún problema para poder gestionar mas de una base de datos con Hibernate.
En Hibernate podemos tener mas de un fichero de configuración, siendo el fichero de configuración por defecto “hibernate.cfg.xml”. Cada fichero de configuración puede representar una conexión a una base de datos distinta, y por supuesto cada fichero de configuración hará referencia a los ficheros de mapeo correspondientes para las tablas de cada base de datos.
La clase que vamos a presentar a continuación pretende facilitar la gestión de está situación, consiguiendo de forma sencilla sesiones de Hibernate a cada una de las bases de datos.
Además la clase se encarga de asegurar que la sesión de Hibernate es única por Thread. Esto puede resultar muy conveniente en aplicaciones multithread o en aplicaciones Web donde múltiples clientes acceden de forma simultánea.
El código de la clase es el siguiente:
Text
package com.autentia.tool;
Text
import java.util.HashMap;
Text
import java.util.Map;
Text
import org.hibernate.HibernateException;
Text
import org.hibernate.Session;
Text
import org.hibernate.SessionFactory;
Text
import org.hibernate.cfg.Configuration;
Text
/**
Text
* Clase de utilidad para conseguir la sesión de Hibernate.
Text
* La sesión es única por thread.
Text
* Pueden existir varios ficheros de configuración.
Text
* Al menos siempre existirá la configuración por defecto sacada del fichero "hibernate.cfg.xml".
Text
*
Text
* @author Autentia
Text
*/
Text
public class HibernateMultipleConfig {
Text
/** Clave para acceder a la sesión por defecto, esta sesión se obtiene a partir del fichero de configuración "hibernate.cfg.xml". */
Text
public static final String DEFAULT = "default";
Text
/** Mapa donde se guardan los SessionFactory para cada uno de los ficheros de configuración. */
Text
private static final Map<String, SessionFactory> sessionFactorys = new HashMap();
Text
/** Atributo único por threat donde se guardan las sesiones para cada uno de los ficheros de configuración. */
Text
private static final ThreadLocal<Map<String, Session>> sessions = new ThreadLocal>();
Text
static {
Text
try {
Text
// Create the DEFAULT SessionFactory from hibernate.cfg.xml
Text
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Text
sessionFactorys.put(DEFAULT, sessionFactory);
Text
} catch (Throwable e) {
Text
// Make sure you log the exception, as it might be swallowed
Esta clase no pretende ser perfecta ni la solución definitiva (si encontráis algún bug decírmelo ;), pero si pretende ser un buen punto de partida para la gestión de múltiples bases de datos con Hibernate.
Seguramente un buen punto a mejorar es como se cierran las sesiones. Habría que intentar facilitar un poco más la vida al desarrollador, de forma que pudiera hacer algo como “aSession.close()” y ya se realizara toda la gestión (os lo dejo como deberes). En cualquier caso no os olvidéis nunca de cerrar las sesiones (y en general de cerrar cualquier recurso: conexiones, streams, …).
Espero que os sirva de ayuda, y nos vemos en el próximo tutorial.
Alejandro es socio fundador de Autentia y nuestro experto en Java EE, Linux y optimización de aplicaciones empresariales.
Ingeniero en Informática y Certified ScrumMaster.
Seguir @alejandropgarci
Si te gusta lo que ves, puedes contratarle para darte ayuda con soporte experto, impartir cursos presenciales en tu empresa o para que realicemos tus proyectos como factoría (Madrid).
Puedes encontrarme en Autentia: Ofrecemos servicios de soporte a desarrollo, factoría y formación.
El Complex Problem Solving (CPS) es un proceso estructurado basado en herramientas, técnicas y actitudes que nos facilita la resolución de problemas complejos.
Descubre cómo el diseño y la psicología del comportamiento utilizan sesgos cognitivos para influir en la toma de decisiones de los usuarios y potenciar la persuasión.
En este artículo exploraremos cómo utilizar ZenWave360 para generar un proyecto completo de Spring Boot con Kotlin a partir de un modelo DSL de Lenguaje Ubicuo.