Múltiples Fuentes de Datos

Vamos a ver los diferentes pasos para configurar una aplicación con dos fuentes de datos.

persistencexml

Modificaremos el fichero persistence.xml para que contenga ambas fuentes.

<?xml version="1.0" encoding="ISO-8859-1"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
		 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 
		 version="1.0">
 
<!-- Definicion de la fuente de datos 1 -->
	<persistence-unit name="fuenteUnoPU" transaction-type="JTA">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		 <!-- Indicamos el fichero orm.xml en caso de tenerlo que usará este datasource -->
		 <!-- Debe estar creado dentro de la carpeta META-INF -->
		 <mapping-file>META-INF/orm-uno.xml</mapping-file>
 		 <jta-data-source>jdbc/Fundeweb DataSource</jta-data-source>
 
 		 <!-- Clases java a las que accede el datasource -->
		 <class>action.session.archivos.entities.FundewebPojo1</class>
 		 <class>action.session.archivos.entities.FundewebPojo2</class> 		 
 		 <exclude-unlisted-classes>true</exclude-unlisted-classes>
		 <properties>			 
			...
 
			<!-- Añadir el esquema por defecto de la Base de Datos -->
			<property name="hibernate.default_schema" value="ESQUEMA_UNO"/>
 
			...
 
		</properties>
	 </persistence-unit>
  <!-- Fin definicion -->
 
  <!-- Definicion de la fuente de datos 2 -->
	 <persistence-unit name="fuenteDosPU" transaction-type="JTA">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
 		 <jta-data-source>jdbc/Fundeweb2 DataSource</jta-data-source>
		 <!-- Indicamos el fichero orm.xml en caso de tenerlo que usará este datasource -->
		 <!-- Debe estar creado dentro de la carpeta META-INF -->
 		 <mapping-file>META-INF/orm-dos.xml</mapping-file>
 		  <!-- Clases java a las que accede el datasource -->
		 <class>action.session.archivos.entities.FundewebPojo3</class>
 		 <class>action.session.archivos.entities.FundewebPojo4</class> 	
 		 <exclude-unlisted-classes>true</exclude-unlisted-classes>
		 <properties>			 
			...
 
			<!-- Añadir el esquema por defecto de la Base de Datos -->
			<property name="hibernate.default_schema" value="ESQUEMA_DOS"/>
 
			...
 
		</properties>
	 </persistence-unit>
	<!-- Fin definicion -->
</persistence>

Cada fuente de datos tendrá acceso a unos determinados beans, los cuales hemos de indicar en el persistence. xml.

Así mismo también habrá que indicar el fichero orm.xml que usa (en caso de que sea necesario) cada fuente de datos, renombrando o eliminando el actual orm.xml, sino se cargara en las dos fuentes de datos y puede producir errores.

components.xml

En el fichero components.xml eliminamos

	<persistence:managed-persistence-context
		name="entityManager" auto-create="true" persistence-unit-jndi-name="@puName@"
		class="es.um.atica.seam.persistence.ManagedPersistenceContext"/>

y añadimos

	<persistence:managed-persistence-context
		name="entityManagerUnoPU" auto-create="true" persistence-unit-jndi-name="@puUnoName@"
		class="es.um.atica.seam.persistence.ManagedPersistenceContext"/>
 
	<persistence:managed-persistence-context
		name="entityManagerDosPU" auto-create="true" persistence-unit-jndi-name="@puDosName@"
		class="es.um.atica.seam.persistence.ManagedPersistenceContext"/>

Ahora eliminamos

	<component name="defaultDataSource" class="es.um.atica.seam.components.ContextVariableFromJndiLookup">
		<property name="jndiPath">jdbc/FundeWeb DataSource</property>
		<property name="classType">javax.sql.DataSource</property>
	</component>

y añadimos

	<component name="dataSourceUno" class="es.um.atica.seam.components.ContextVariableFromJndiLookup">
		<property name="jndiPath">jdbc/Fundeweb2 DataSource</property>
		<property name="classType">javax.sql.DataSource</property>
	</component>
 
	<component name="dataSourceDos" class="es.um.atica.seam.components.ContextVariableFromJndiLookup">
		<property name="jndiPath">jdbc/Fundeweb2 DataSource</property>
		<property name="classType">javax.sql.DataSource</property>
	</component>


components.properties

En el fichero components.properties, buscamos la propiedad puName y la borramos añadiendo las siguentes:

puUnoName=fuenteUnoPU
puDosName=fuenteDosPU


DAS

Para los DAS, es necesario realizar la siguiente modificación. Para los DAS de las entidades de la fuenteUnoPU tendrian que heredar de la clase:

public abstract class DataAccessService1PUImpl<T> extends DataAccessServiceImpl<T> {
 
    @In("entityManagerUnoPU")
    protected EntityManager entityManager;
 
    @Override
    protected EntityManager getEntityManager() {
        return entityManager;
    }
 
    @Override
    protected void setEntityManager( EntityManager entityManager ) {
        this.entityManager = entityManager;
    }
 
}

Para los DAS de las entidades de la fuenteDosPU tendrian que heredar de la clase:

public abstract class DataAccessService2PUImpl<T> extends DataAccessServiceImpl<T> {
 
    @In("entityManagerDosPU")
    protected EntityManager entityManager;
 
    @Override
    protected EntityManager getEntityManager() {
        return entityManager;
    }
 
    @Override
    protected void setEntityManager( EntityManager entityManager ) {
        this.entityManager = entityManager;
    }
 
}


Entidades

Para aplicaciones FundeWeb 1.5, parece que es necesario añadir la anotación @PersistenceUnit a las entidades, indicando el nombre de la unidad de persistencia a la que pertenecen. Ejemplo para las entidades de la unidad de persitencia fuenteUnoPU:

import javax.persistence.Entity;
import javax.persistence.PersistenceUnit;
import javax.persistence.Table;
 
 
@PersistenceUnit("fuenteUnoPU")
@Entity
@Table(name = "TABLA_TRES", schema = "ESQUEMA_UNO")
public class FundewebPojo1 {
    ...
}

Ejemplo para las entidades de la unidad de persitencia fuenteUnoDos:

import javax.persistence.Entity;
import javax.persistence.PersistenceUnit;
import javax.persistence.Table;
 
 
@PersistenceUnit("fuenteUnoDos")
@Entity
@Table(name = "TABLA_TRES", schema = "ESQUEMA_DOS")
public class FundewebPojo3 {
    ...
}

JUAN MIGUEL BERNAL GONZALEZ 11/03/2020 16:07