Utiliser plusieurs bases de données avec Spring/JPA/Hibernate
http://thegeekcorner.free.fr 1
Utiliser plusieurs bases de données
avec Spring/JPA/Hibernate
créé le 11/10/2010 par Antoine Schellenberger .
dernière mise à jour le 11/04/2010.
Ce tutoriel présente comment utiliser deux connexions à deux bases de données différentes
dans des transactions séparées en utilisant les framework spring/jpa-hibernate.
Remarques: Il ne s’agit pas ici de traiter de plusieurs
connexions à des bases de données distincte au sein d’une
seule et même transaction (JTA).
Contexte technique et prérequis
Avoir Créé un projet vierge avec les librairies
d’hibernate/jpa/spring et leur prérequis respectifs
dans le classpatch (/lib)
Avoir un moteur de base de données Postgresql
installé dont vous êtes l’administrateur (tout du moins
vous devez avoir la possibilité de créer de nouvelles
bases de données)
Création des 2 bases de données
Dans un terminal :
createdb schemaA
createdb schemaB
Les fichiers de configurations
persistence.xml
Créer le fichier persistence.xml à la racine du
répertoire META-INF de votre projet (src/META-
INF)
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
version="1.0">
<persistence-unit name="jpaPU" transaction-
type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</
provider>
<class>net.thegeekcorner.ClasseA</class>
<exclude-unlisted-classes>true</exclude-unlisted-
classes>
<properties>
<property
name="hibernate.bytecode.use_reflection_optimizer"
value="true"/>
<property name="hibernate.jdbc.fetch_size"
value="30" />
<property name="connection.isolation" value="2" />
<property
name="hibernate.jdbc.use_scrollable_resultset"
value="false" />
<property name="hibernate.jdbc.batch_size"
value="30"/>
<property name="hibernate.hbm2ddl.auto"
value="update"/>
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.format_sql"
value="false" />
<property name="use_sql_comments" value="false" />
<property name="hibernate.query.substitutions"
value="true" />
<property name="hibernate.dialect"
value="org.hibernate.dialect.PostgreSQLDialect" />
</properties>
</persistence-unit>
<persistence-unit name="jpaPUBis" transaction-
type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</
provider>
<class>net.thegeekcorner.ClassB</class>
<exclude-unlisted-classes>true</exclude-unlisted-
classes>
<properties>
<property
name="hibernate.bytecode.use_reflection_optimizer"
value="true" />
<property name="hibernate.jdbc.fetch_size"
value="30" />
<property name="connection.isolation" value="2" />
<property
name="hibernate.jdbc.use_scrollable_resultset"
value="false" />
<property name="hibernate.jdbc.batch_size"
value="30" />
<property name="hibernate.hbm2ddl.auto"
value="update"/>
<property name="hibernate.show_sql" value="false" /
>
<property name="hibernate.format_sql"
value="false" />
<property name="use_sql_comments" value="false" />
<property name="hibernate.query.substitutions"
value="true" />
<property name="hibernate.dialect"
value="org.hibernate.dialect.PostgreSQLDialect" />
</properties>
</persistence-unit>
</persistence>
Hélas, ici devons placer toutes nos classes
persistentes à l’aide de l’attribut <class>. C’est
la balise <exclude-unlisted-classes> qui nous
permet de ne pas avoir ClassA dans le schemaB et
ClassB dans le schemaA
spring-persistence.xml
Créer le fichier spring-persistence.xml à la racine
du répertoire META-INF de votre projet (src/META-
INF)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
Utiliser plusieurs bases de données avec Spring/JPA/Hibernate
http://thegeekcorner.free.fr 2
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-
beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-
tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-
aop-3.0.xsd">
<bean class="org.springframework.orm.jpa.support.
PersistenceAnnotationBeanPostProcessor" />
<tx:annotation-driven />
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.\
LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="persistenceUnitName" value="jpaPU" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.\
HibernateJpaVendorAdapter">
<property name="database" value="POSTGRESQL" />
<property name="databasePlatform"
value="org.hibernate.dialect.PostgreSQLDialect" />
</bean>
</property>
</bean>
<bean id="entityManagerFactoryBis"
class="org.springframework.orm.jpa.\
LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSourceBis" />
<property name="persistenceUnitName" value="jpaPUBis" /
>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.\
HibernateJpaVendorAdapter">
<property name="database" value="POSTGRESQL" />
<property name="databasePlatform"
value="org.hibernate.dialect.PostgreSQLDialect" />
</bean>
</property>
</bean>
<bean class="org.springframework.orm.jpa.support.\
PersistenceAnnotationBeanPostProcessor" />
<bean id="dataSource"
class="org.springframework.jdbc.datasource.\
DriverManagerDataSource">
<property name="driverClassName"
value="org.postgresql.Driver" />
<property name="url" value="jdbc:postgresql://
localhost:5432/schemaA" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<bean id="dataSourceBis"
class="org.springframework.jdbc.datasource.\
DriverManagerDataSource">
<property name="driverClassName"
value="org.postgresql.Driver" />
<property name="url" value="jdbc:postgresql://
localhost:5432/schemaB" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<bean id="hibernateDialect"
class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /
>
<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory"
ref="entityManagerFactory" />
<property name="dataSource" ref="dataSource" />
<property name="jpaDialect" ref="hibernateDialect" />
<qualifier value="schemaA"/>
</bean>
<bean id="transactionManagerBis"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory"
ref="entityManagerFactoryBis" />
<property name="dataSource" ref="dataSourceBis" />
<property name="jpaDialect" ref="hibernateDialect" />
<qualifier value="schemaB"/>
</bean>
</beans>
Business.xml
Ce fichier permet d’instancier les objets de votre
couche service
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-
beans-3.0.xsd
>
<bean id="puServiceA"
class="net.thegeekcorner.PUServiceA" />
<bean id="puServiceB"
class="net.thegeekcorner.PUServiceB” />
</beans>
applicationContext.xml
Dans ce fichier on inclus les 2 fichiers de
configurations XML liés à la couche service et le
mécanisme de persistence
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-
beans-3.0.xsd
">
<import resource="classpath:/META-INF/spring-
persistence.xml" />
<import resource="classpath:/META-INF/business.xml" />
</beans>
Les classes JAVA
Créer un nouveau projet avec comme package
principal net.thegeekcorner
Création des Entités persistentes
ClasseA.java
package net.thegeekcorner;
import java.util.LinkedList;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class ClassA {
private String attributAa;
private String attributAb;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getAttributAa(){
Utiliser plusieurs bases de données avec Spring/JPA/Hibernate
http://thegeekcorner.free.fr 3
return attributAa;
}
public void setAttributAa(String attributAa) {
this.attributAa = attributAa;
}
public String getAttributAb(){
return attributAb;
}
public void setAttributAb(String attributAb){
this.attributAb = attributAb;
}
}
ClasseB.java
package net.thegeekcorner;
import java.util.LinkedList;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class ClassB {
private String attributBa;
private String attributBb;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getAttributBa() {
return attributBa;
}
public void setAttributBa(String attributBa) {
this.attributBa = attributBa;
}
public String getAttributBb() {
return attributBb;
}
public void setAttributBb(String attributBb) {
this.attributBb = attributBb;
}
}
Création de la couche service
Attention normalement on passe par une couche
DAO mais pour simplifier l’exemple on le fait pas
et on injecte directement l’entitymanager dans la
couche service (boooouuu)
PUServiceA.java
package org.inra.ore.lacs.plugins.lacs1.business.local;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import net.thegeekcorner.ClassA;
import
org.springframework.transaction.annotation.Transactional;
public class PUServiceA{
@PersistenceContext(unitName="jpaPUBis")
protected EntityManager entityManager;
@Transactional("schemaA")
public void test(){
ClassA a= new ClassA();
a.setAttributAa("mon attribut Aa");
a.setAttributAb("mon attribut Ab");
entityManager.persist(a);
entityManager.flush();
}
}
PUServiceB.java
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import net.thegeekcorner.ClassA;
import
org.springframework.transaction.annotation.Transactional;
public class PUServiceB{
@PersistenceContext(unitName="jpaPUBis")
protected EntityManager entityManager;
@Transactional("schemaB")
public void test(){
ClassB b= new ClassB();
b.setAttributBa("mon attribut Ba");
b.setAttributBb("mon attribut Bb");
entityManager.persist(b);
entityManager.flush();
}
}
Création de la classe pilote
Starter.java
package net.thegeekcorner
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.\
ClassPathXmlApplicationContext;
public class Starter {
public static void main(String[] args) {
ApplicationContext context = new
ClassPathXmlApplicationContext("META-INF/
applicationContext.xml");
PUServiceA serviceA = (PUServiceA)
context.getBean("puServiceA");
serviceA.test();
PUServiceB serviceB = (PUServiceB)
context.getBean("puServiceB");
serviceB.test();
}
}
Après avoir lancé l’application StarterA vous
devriez avoir dans chacune de vos bases de données
schemaA et schemaB une nouvelle entrée.
Table des matières
Contexte technique et prérequis.............................................................................................p. 1
Création des 2 bases de données............................................................................................p. 1
Les fichiers de configurations................................................................................................. p. 1
persistence.xml ......................................................................................................p. 1
spring-persistence.xml .......................................................................................p. 1
Business.xml ............................................................................................................ p. 2
applicationContext.xml .......................................................................................p. 2
Les classes JAVA ...................................................................................................................p. 2
Création des Entités persistentes ..................................................................................p. 2
ClasseA.java ....................................................................................................p. 2
ClasseB.java ....................................................................................................p. 3
Création de la couche service .......................................................................................p. 3
PUServiceA.java ..............................................................................................p. 3
PUServiceB.java ..............................................................................................p. 3
Création de la classe pilote .......................................................................................... p. 3
Starter.java ....................................................................................................p. 3
1 / 4 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !