Hibernate con dos o mas orígenes de datos

Se me planteó un problema, ¿cómo hacer que hibernate tenga más de un orígen de datos? Estuve investigando y aunque encontré varias soluciones, no encontré la ideal, así que hice una mezcla de varias de ellas. Lo primero fue crear una clase HibernateUtil que os copio después, y para utilizarla es muy sencillo.

Primero la inicializamos en mi caso con un origen de datos por defecto y luego otros dos, uno para mysql y otro para una base de datos oracle:

HibernateUtil.createSessionFactory();
HibernateUtil.buildSessionFactory("oracle", "hibernate.oracle.cfg.xml");
HibernateUtil.buildSessionFactory("mysql", "hibernate.mysql.cfg.xml");

Estos ficheros deben estar en el mismo punto que a clase HibernateUtil, sino deberéis modificar su ruta según vuestro interés.

A continuación podemos guardar o leer usando Hibernate de la forma habitual:

public void save(Formulario objeto) {
Session session=HibernateUtil.currentSession("mysql");
Transaction tx = null;
try {
tx = session.beginTransaction();
session.save(objeto);
tx.commit();
} catch (RuntimeException e) {
if (tx != null) {
logger.error("Error al guardar " + e);
}
tx.rollback();
  }
}

 
Y ya por fin, el código de la clase HibernateUtil

package es.uva.pdf.dao;

import java.net.URL;
import java.util.HashMap;

import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import com.sun.tools.javac.util.Log;

import es.uva.pdf.struts2.action.ListadoPersonal;

public class HibernateUtil {

private static Logger log = Logger.getLogger(HibernateUtil.class);

private static HashMap sessionFactoryMap = new HashMap();

public static final ThreadLocal sessionMapsThreadLocal = new ThreadLocal();

public static Session currentSession(String key) throws HibernateException {

HashMap sessionMaps = (HashMap) sessionMapsThreadLocal
.get();

if (sessionMaps == null) {
sessionMaps = new HashMap();
sessionMapsThreadLocal.set(sessionMaps);
}

// Open a new Session, if this Thread has none yet
Session s = (Session) sessionMaps.get(key);
if (s == null) {
s = ((SessionFactory) sessionFactoryMap.get(key)).openSession();
sessionMaps.put(key, s);
}

return s;
}

public static Session currentSession() throws HibernateException {
return currentSession("");
}

public static void closeSessions() throws HibernateException {
HashMap sessionMaps = (HashMap) sessionMapsThreadLocal
.get();
sessionMapsThreadLocal.set(null);
if (sessionMaps != null) {
for (Session session : sessionMaps.values()) {
if (session.isOpen())
session.close();
}
;
}
}

public static void closeSession() {
HashMap sessionMaps = (HashMap) sessionMapsThreadLocal
.get();
sessionMapsThreadLocal.set(null);
if (sessionMaps != null) {
Session session = sessionMaps.get("");
if (session != null && session.isOpen())
session.close();
}
}

public static void closeSession(String key) {
HashMap sessionMaps = (HashMap) sessionMapsThreadLocal
.get();
if (sessionMaps != null) {
Session session = sessionMaps.get(key);
if (session != null && session.isOpen())
session.close();
}
}

public static void buildSessionFactories(HashMap configs) {
try {
// Create the SessionFactory
for (String key : configs.keySet()) {
URL url = HibernateUtil.class.getResource(configs.get(key));
SessionFactory sessionFactory = new Configuration().configure(
url).buildSessionFactory();
sessionFactoryMap.put(key, sessionFactory);
}

} catch (Exception ex) {
ex.printStackTrace(System.out);
log.error("Initial SessionFactory creation failed.", ex);
throw new ExceptionInInitializerError(ex);

} // end of the try - catch block
}

public static void buildSessionFactory(String key, String path) {
try {
// Create the SessionFactory
URL url = HibernateUtil.class.getResource(path);
SessionFactory sessionFactory = new Configuration().configure(url)
.buildSessionFactory();
sessionFactoryMap.put(key, sessionFactory);

} catch (Throwable ex) {

log.error("Initial SessionFactory creation failed.", ex);
throw new ExceptionInInitializerError(ex);

} // end of the try - catch block
}

public static void buildSessionFactory() {
// Por defecto
try {
// Create the SessionFactory
SessionFactory sessionFactory = new Configuration().configure()
.buildSessionFactory();
sessionFactoryMap.put("default", sessionFactory);
} catch (Throwable ex) {
log.error("Initial SessionFactory creation failed.", ex);
throw new ExceptionInInitializerError(ex);

} // end of the try - catch block
}

// alias
public static void createSessionFactory() {
buildSessionFactory();
}

>}

webmaster

Grupo web de la Universidad de Valladolid - STIC

2 comentarios en “Hibernate con dos o mas orígenes de datos”

Responder a KonstantinMiller Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.