martes, 12 de diciembre de 2017

La API de JPA 2.1 (V) Programaticamente actualizar la conexion a la BD

Se pueden crear persistence units programaticamente en estas condiciones:

  1. Utilizando Spring (ver stack overflow)
  2. Utilizando Hibernate (ver el mismo link en  stack overflow)
  3. Implementando la interface PersistenceProvider (ver el mismo link en stack overflow y JPA API

  • En principio voy a descartar Spring pues mete muchas jars que no necesitamos.
  • También voy a descartar usar Hibernate cuando se desmarca de la JPA API
  • El tercer método parece un poco laborioso ya que hay que implementar la interface PersistenceProvider.
Lo que he pensado, es tener una persistence unit (o varias) definidas en el persistencel.xml y modificar la conexión a la BD.

Para ello podemos tener un persistence.xml como este


 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
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    
        <persistence-unit name="sqlserver-jtds" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

          <properties>
            <!-- Configuring JDBC properties -->
            <!-- -->
            <!-- -->
            
             
            <property name="javax.persistence.jdbc.url" value="jdbc:jtds:sqlserver://111.111.11.11:1433/DB2017" /> 
            <property name="javax.persistence.jdbc.user" value="myuser" />
            <property name="javax.persistence.jdbc.password" value="mypassword" />
            <property name="javax.persistence.jdbc.driver" value="net.sourceforge.jtds.jdbc.Driver" />

            <!-- Hibernate properties -->
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServer2008Dialect" />
            <property name="hibernate.hbm2ddl.auto" value="none" />  <!-- update -->

            <!-- Configuring Connection Pool -->
            <property name="hibernate.c3p0.min_size" value="5" />
            <property name="hibernate.c3p0.max_size" value="20" />
            <property name="hibernate.c3p0.timeout" value="500" />
            <property name="hibernate.c3p0.max_statements" value="50" />
            <property name="hibernate.c3p0.idle_test_period" value="2000" />
          </properties>
    </persistence-unit>  
          
</persistence>

la idea es seleccionar esta persistence unit "sqlserver-jtds" y cambiarle la propieded "javax-persistence.jdbc.url" a "jdbc:jtds:sqlserver://111.111.11.11:1433/DB2018".

Para ello, basandonos en stack overflow ejecutamos este código java:


1
2
3
Properties props = new Properties();
props.setProperty("javax.persistence.jdbc.url", "jdbc:jtds:sqlserver://111.111.11.11:1433/DB2018");
EntityManagerFactory emf=javax.persistence.Persistence.createEntityManagerFactory("sqlserver-jtds", props);

Con lo que hemos aprovechado el persistence.xml que había y le hemos cambiado la conexión programáticamente.

Esto viene bien cuando se cambia de año y hay que trabajar en otra base de datos correspondiente a ese año. Para ello se puede utilizar un fichero de propiedades para guardar el nombre de la BD.

En fin chapucillas que vienen bien y no complican el código.


No hay comentarios :

Publicar un comentario