Reconectar hibernate a otra base de datos en tiempo de ejecución con jdom2
Publicado por Román (1 intervención) el 12/06/2013 14:00:04
Bueno aquí os traigo un problema que me surgió mientras realizaba una aplicación en java con hibernate, trata sobre como reconectar hibernate a otra base de datos, con otro usuario y contraseña, en tiempo de ejecución. Cuando comencé a googlear para ver si encontraba solución al asunto me di cuenta que hay muy poco sobre el tema o que yo googleo muy mal XD, así que aquí os traigo mi forma de hacerlo, no aseguro que sea la mejor pero funciona. Antes de mostrar el código os cuento como hago yo la conexión con hibernate, tanto la configuración de hibernate como el mapeo de las entidades las hago en el hibernate.cfg.xml y como pool de conexiones utilizo C3PO y para leer dicha configuración del fichero xml utilizo jdom2, bueno sin enrollarme más os dejo el código.
Ojala os sirva de ayuda, un saludo y para cualquier cosa aqui me teneis.
hibernate.cfg.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="c3p0.acquire_increment">1</property>
<property name="c3p0.idle_test_period">100</property>
<property name="c3p0.max_size">5</property>
<property name="c3p0.max_statements">10</property>
<property name="c3p0.min_size">3</property>
<property name="c3p0.timeout">200</property>
<property name="connection.driver_class">DRIVER DEL JDBC</property>
<property name="connection.url">DIRECCION DE LA BASE DE DATOS</property>
<property name="connection.username">USUARIO</property>
<property name="connection.password">CONTRASEÑA</property>
<property name="dialect">DIALECTO DE LA BASE DE DATOS</property>
<property name="show_sql">false</property>
<property name="hbm2ddl.auto">update</property>
*/---------------------------
Mapeo de las clases.
---------------------------*/
</session-factory>
</hibernate-configuration>
Código fuente
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.filter.Filters;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.DOMOutputter;
import org.jdom2.xpath.XPathExpression;
import org.jdom2.xpath.XPathFactory;
import org.jdom2.Document;
public class HibernateUtil {
private static URL xmlFileURL;
private static SessionFactory sessionFactory;
static {
xmlFileURL = HibernateUtil.class.getClassLoader().getResource("hibernate.cfg.xml");
try {
sessionFactory = new Configuration().configure(xmlFileURL).buildSessionFactory();
}
catch (HibernateException exception) {
System.out.println("Ocurrio un error en la inicializacion de la SessionFactory: " + exception);
throw new ExceptionInInitializerError(exception);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static void configureConnect(String dataBaseName, String userName, String password) throws FileNotFoundException, JDOMException, IOException {
sessionFactory.close();
sessionFactory = new Configuration().configure(modifyConnectConfiguration(dataBaseName, userName, password)).buildSessionFactory();
}
private static org.w3c.dom.Document modifyConnectConfiguration(String dataBaseName, String userName, String password) throws FileNotFoundException, JDOMException, IOException {
Document documentJDOM = new SAXBuilder().build(xmlFileURL);
XPathExpression<Element> xPathExpression = XPathFactory.instance().compile("/hibernate-configuration/session-factory/property", Filters.element());
List<Element> elementList = xPathExpression.evaluate(documentJDOM);
//Esto es relativo a en que posición aparecen las lineas en el hibernate.cfg.xml
elementList.get(8).setText(dataBaseName);
elementList.get(9).setText(userName);
elementList.get(10).setText(password);
DOMOutputter domOutputter = new DOMOutputter();
return domOutputter.output(documentJDOM);
}
}
Ojala os sirva de ayuda, un saludo y para cualquier cosa aqui me teneis.
Valora esta pregunta


1