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();
}
>}
Hi, very nice post. I have been wonder’n bout this issue,so thanks for posting
Hi. I like the way you write. Will you post some more articles?