Java - Reconectar hibernate a otra base de datos en tiempo de ejecución con jdom2

   
Vista:

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.

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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
1
Responder
Imágen de perfil de xve

Reconectar hibernate a otra base de datos en tiempo de ejecución con jdom2

Publicado por xve (261 intervenciones) el 12/06/2013 14:36:46
Muy bueno Román!!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar