Vamos a ver los diferentes pasos para configurar una aplicación con dos fuentes de datos.
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.
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>
En el fichero components.properties, buscamos la propiedad puName y la borramos añadiendo las siguentes:
puUnoName=fuenteUnoPU puDosName=fuenteDosPU
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; } }
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