IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

Connexion à deux bases de données


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 26
    Par défaut Connexion à deux bases de données
    Bonjour,

    J'ai une application utilisant Spring, JPA, Struts2 et Hibernate où je dois me connecter à deux bases et insérer des données dans les deux.

    J'ai essayé de définir deux dataSources, deux entityManagerFactory et cela fonctionne quandje récupère juste les données mais quand j'insère les données dans le persistance unit qui à été déclaré en deuxième cela ne marche pas, je n'ai aucun message d'erreur mais la requête n'est pas exécutée??

    Voici mon applicationContext.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
     
    <?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:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
     
        <!-- Chargement de propriétés -->
        <bean name="propertyPlaceholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="locations">
                <value>classpath:hibernate.properties</value>
            </property>
        </bean>
     
        <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
     
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="${datasource1.driver}" />
            <property name="url" value="${datasource1.url}" />
            <property name="username" value="${datasource1.username}" />
            <property name="password" value="${datasource1.password}" />
        </bean>
     
        <bean id="entityManagerFactory"
            class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" >
            <property name="dataSource" ref="dataSource" />
            <property name="jpaVendorAdapter">
                <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                    <property name="database" value="${database}" />
                    <property name="showSql" value="${hibernate.showSql}"/>
                </bean>
            </property>
            <property name="jpaProperties">
                <props>
                    <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                </props>
            </property>
            <property name="persistenceUnitName" value="PU"/>
        </bean>
     
        <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" >
            <property name="entityManagerFactory" ref="entityManagerFactory" />
        </bean>
     
        <tx:annotation-driven transaction-manager="transactionManager"  />
     
        <bean id="dataSource2" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="${datasource2.driver}" />
            <property name="url" value="${datasource2.url}" />
            <property name="username" value="${datasource2.username}" />
            <property name="password" value="${datasource2.password}" />
        </bean>
     
        <bean id="entityManagerFactory2"
            class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" >
            <property name="dataSource" ref="dataSource2" /> 
            <property name="jpaVendorAdapter">
                <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                    <property name="database" value="${database}" />
                    <property name="showSql" value="${hibernate.showSql}"/>
                </bean>
            </property>
            <property name="jpaProperties">
                <props>
                    <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                </props>
            </property>
            <property name="persistenceUnitName" value="PU2"/>
     
        </bean>
     
        <bean id="transactionManager2" class="org.springframework.orm.jpa.JpaTransactionManager" >
            <property name="entityManagerFactory" ref="entityManagerFactory2" />
        </bean>
     
        <tx:annotation-driven transaction-manager="transactionManager2"  />
     
     
    	<!-- DAO -->
    	<bean id="dao1" class="com.Dao1" />
    	<bean id="dao2" class="com.Dao2" />
     
     
    </beans>

    et mon persistance.xml


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
     
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="1.0" 
        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">
     
    	<persistence-unit name="PU">
            <class>
            com.Classe1</class>
     
        </persistence-unit>
     
    	<persistence-unit name="PU2">
    		<class>
    		com.Classe2</class>
    		<class>
    		com.Classe3</class>
    	</persistence-unit>
     
    </persistence>

    Avez-vous une idée d'où peux venir le fait que je ne puisse insérer que dans les beans qui sont en premier dans mon fichier de persistance?

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par Jack-Ob Voir le message
    Bonjour,

    J'ai une application utilisant Spring, JPA, Struts2 et Hibernate où je dois me connecter à deux bases et insérer des données dans les deux.

    J'ai essayé de définir deux dataSources, deux entityManagerFactory et cela fonctionne quandje récupère juste les données mais quand j'insère les données dans le persistance unit qui à été déclaré en deuxième cela ne marche pas, je n'ai aucun message d'erreur mais la requête n'est pas exécutée??

    Voici mon applicationContext.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
     
    <?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:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
     
        <!-- Chargement de propriétés -->
        <bean name="propertyPlaceholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="locations">
                <value>classpath:hibernate.properties</value>
            </property>
        </bean>
     
        <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
     
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="${datasource1.driver}" />
            <property name="url" value="${datasource1.url}" />
            <property name="username" value="${datasource1.username}" />
            <property name="password" value="${datasource1.password}" />
        </bean>
     
        <bean id="entityManagerFactory"
            class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" >
            <property name="dataSource" ref="dataSource" />
            <property name="jpaVendorAdapter">
                <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                    <property name="database" value="${database}" />
                    <property name="showSql" value="${hibernate.showSql}"/>
                </bean>
            </property>
            <property name="jpaProperties">
                <props>
                    <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                </props>
            </property>
            <property name="persistenceUnitName" value="PU"/>
        </bean>
     
        <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" >
            <property name="entityManagerFactory" ref="entityManagerFactory" />
        </bean>
     
        <tx:annotation-driven transaction-manager="transactionManager"  />
     
        <bean id="dataSource2" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="${datasource2.driver}" />
            <property name="url" value="${datasource2.url}" />
            <property name="username" value="${datasource2.username}" />
            <property name="password" value="${datasource2.password}" />
        </bean>
     
        <bean id="entityManagerFactory2"
            class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" >
            <property name="dataSource" ref="dataSource2" /> 
            <property name="jpaVendorAdapter">
                <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                    <property name="database" value="${database}" />
                    <property name="showSql" value="${hibernate.showSql}"/>
                </bean>
            </property>
            <property name="jpaProperties">
                <props>
                    <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                </props>
            </property>
            <property name="persistenceUnitName" value="PU2"/>
     
        </bean>
     
        <bean id="transactionManager2" class="org.springframework.orm.jpa.JpaTransactionManager" >
            <property name="entityManagerFactory" ref="entityManagerFactory2" />
        </bean>
     
        <tx:annotation-driven transaction-manager="transactionManager2"  />
     
     
    	<!-- DAO -->
    	<bean id="dao1" class="com.Dao1" />
    	<bean id="dao2" class="com.Dao2" />
     
     
    </beans>

    et mon persistance.xml


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
     
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="1.0" 
        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">
     
    	<persistence-unit name="PU">
            <class>
            com.Classe1</class>
     
        </persistence-unit>
     
    	<persistence-unit name="PU2">
    		<class>
    		com.Classe2</class>
    		<class>
    		com.Classe3</class>
    	</persistence-unit>
     
    </persistence>

    Avez-vous une idée d'où peux venir le fait que je ne puisse insérer que dans les beans qui sont en premier dans mon fichier de persistance?
    apparement vous voulez utiliser @Transactional ?

    mauvaise nouvelle : cela ne fonctionne qu'avec un seul transactionManager dans l'applicationContext…

    vous n'avez probablement pas fait attention à tous les warnings générés au démarrage parce que normalement il doit y en avoir un qui signale la présence de plus d'un transaction manager…

    Solution :

    utiliser les instructions <aop: … > ou AspectJ pour spécifier les méthodes transactionnelles…

  3. #3
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 26
    Par défaut
    Bonjour, merci de m'aider.

    J'ai essayé de trouver des exemples sur aop mais sans grand succès par rapport à mon problème.

    N'est ce pas plutôt mon fichier de persistance qui est mal déclaré car dès que je dois réaliser une transaction sur une entité définie dans la deuxième base celle ci ne s'exécute pas.

    Quelqu'un a-t-il une idée?

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par Jack-Ob Voir le message
    Bonjour, merci de m'aider.

    J'ai essayé de trouver des exemples sur aop mais sans grand succès par rapport à mon problème.

    N'est ce pas plutôt mon fichier de persistance qui est mal déclaré car dès que je dois réaliser une transaction sur une entité définie dans la deuxième base celle ci ne s'exécute pas.

    Quelqu'un a-t-il une idée?
    je vous ai répondu :

    @Transactional est incapable de gérer plusieurs transactionManager.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    <beans …
    	xmlns:tx="http://www.springframework.org/schema/tx"
    	xmlns:aop="http://www.springframework.org/schema/aop"
    …
    	xsi:schemaLocation="…				http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
    ">
    …
        <aop:aspectj-autoproxy />
    …
     
    <aop:config>
    	<aop:pointcut id="YOUR_POINT_ID" expression="execution(POINTCUT_PATTERN) "/>
    …
    	<aop:advisor advice-ref="SERVICE_REFERENCE" pointcut-ref="YOUR_POINT_ID"/>
    …
    </aop:config>
     
     
    <tx:advice id="SERVICE_REFERENCE" transaction-manager="THE_TRANSACTIONMANAGER_BEAN_ID">
    		<tx:attributes>
    			<tx:method name="METHOD_NAME_PATTERN" propagation="YOUR_PROPAGATION" read-only="TRUE_OR_FALSE"/>
    		</tx:attributes>
    </tx:advice>
    …

  5. #5
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 26
    Par défaut
    Merci de m'aider par contre peux tu me préciser les valeurs à indiquer?

    Faut - il que je déclare un tx:advice et un aop:config pour chacun de mes transactionManager (ou juste un pour le deuxième et pour le premier je laisse l'annotation @transactional)?

    Je ne vois pas quelle expression mettre dans aop:pointcut?

    Pour chacune des méthode de mes dao dois-je préciser cette ligne? Ou il y a-t-il un moyen de toutes les préciser d'un coup?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <tx:method name="METHOD_NAME_PATTERN" propagation="YOUR_PROPAGATION" read-only="TRUE_OR_FALSE"/>
    A quoi correspond la propagation?

    Merci d'avance car je commence à désespérer

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par Jack-Ob Voir le message
    Merci de m'aider par contre peux tu me préciser les valeurs à indiquer?

    Faut - il que je déclare un tx:advice et un aop:config pour chacun de mes transactionManager (ou juste un pour le deuxième et pour le premier je laisse l'annotation @transactional)?

    Je ne vois pas quelle expression mettre dans aop:pointcut?

    Pour chacune des méthode de mes dao dois-je préciser cette ligne? Ou il y a-t-il un moyen de toutes les préciser d'un coup?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <tx:method name="METHOD_NAME_PATTERN" propagation="YOUR_PROPAGATION" read-only="TRUE_OR_FALSE"/>
    A quoi correspond la propagation?

    Merci d'avance car je commence à désespérer
    vous pouvez le faire uniquement pour le deuxième mais personnellement je préfère voir toute la config des transactions à un seul endroit…

    pour l'expression : il faut lire la doc…
    par exemple toutes les méthodes d'une classe =
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    expression( * path.of.my.class.*(..) )
    la propagation : il est temps que vous lisiez la doc sur les transactions !
    REQUIRES_NEW, REQUIRED, …
    cela signifie ce que le transaction manager doit faire : toujours créer une nouvelle transaction, réutiliser l'existante s'il y en a une, etc.
    (ce sont les mêmes paramètres que pour @Transactional…)

Discussions similaires

  1. [MySQL] Connexion à deux bases de données
    Par bourbita.thameur dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 16/04/2009, 12h23
  2. Connexion à deux bases de données
    Par nbinot dans le forum JDBC
    Réponses: 7
    Dernier message: 29/10/2008, 15h46
  3. [MySQL] Connexion à deux bases de données sur la même page !
    Par Mike91 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 13/06/2008, 10h27
  4. Réponses: 13
    Dernier message: 10/12/2005, 13h34
  5. [MySQL] Connexion à deux bases de données
    Par genova dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 17/09/2005, 00h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo