Mostrando entradas con la etiqueta programatica. Mostrar todas las entradas
Mostrando entradas con la etiqueta programatica. Mostrar todas las entradas

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.