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 :

[JPA][HIBERNATE] avoir plusieurs connexion possible pour les même DAO


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2002
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 89
    Par défaut [JPA][HIBERNATE] avoir plusieurs connexion possible pour les même DAO
    Voici mon problème:
    J'ai une configuration spring/hibernate/jpa (application desktop)
    J'ai des DAO en pur JPA, avec annotation activé.

    Je voudrai pouvoir "changer" de datasource à la demande pour pouvoir me connecter sur une base de donnée ou une autre, avec les même DAO.

    Voici la classe de base de mes DAO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public abstract class JpaDaoSupport<T extends IEntity, ID extends Serializable> implements DAO<T , ID>{
     
     
        @PersistenceContext
        protected EntityManager em;
     
    ....
    }
    Est ce que quelqu'un à une idée ou l'a déjà fait?

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Par défaut
    Il te faut un autre entitymanager que tu obtiendras avec partir d'une deuxième persitence unit que tu déclareras dans ton descripteur persistence.xml.

  3. #3
    Membre éclairé
    Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2002
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 89
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Il te faut un autre entitymanager que tu obtiendras avec partir d'une deuxième persitence unit que tu déclareras dans ton descripteur persistence.xml.
    oui merci effectivement ca marche pour obtenir un entite manager spécifique

    dans mon DAO maintenant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public abstract class JpaDaoSupport<T extends IEntity, ID extends Serializable> implements DAO<T , ID>{
     
     
        @PersistenceContext(unitName = "test_pu_remote")
        protected EntityManager em_remote;
     
        @PersistenceContext(unitName = "test_pu")
        protected EntityManager em;
    dans mon persistance.xml, deux PU mais avec le même fichier de mapping

    dans le fichier spring, deux entityManagerFactory, avec chacun une référence vers le persistenceUnitName.

    Il me reste un problème:
    Les transactions sont "annotation-driven"
    et <tx:annotation-driven/> ne marche pas pour les deux configuration.

    Ca ne marche que si je suis spécifique
    <tx:annotation-driven transaction-manager="transactionManagerRemote"/>
    ou
    <tx:annotation-driven transaction-manager="transactionManagerLocal"/>

    (et les deux en même temps ca ne marche pas??)

  4. #4
    Membre éclairé
    Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2002
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 89
    Par défaut
    bon j'ai trouvé une solution avec AOP mais je ne suis pas sur que ce soit optimal:

    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
    <aop:config>
            <aop:pointcut id="libraryServicesMethods" expression="execution(* .LibraryServices.*(..))"/>
            <aop:advisor advice-ref="txAdvice" pointcut-ref="libraryServicesMethods"/>
            <aop:advisor advice-ref="txAdviceRemote" pointcut-ref="libraryServicesMethods"/>
        </aop:config>
     
     
          <tx:advice id="txAdvice" transaction-manager="transactionManager">
            <tx:attributes>
              <tx:method name="*" propagation="REQUIRED"/>
            </tx:attributes>
          </tx:advice>
     
        <tx:advice id="txAdviceRemote" transaction-manager="transactionManagerRemote">
          <tx:attributes>
            <tx:method name="*" propagation="REQUIRED"/>
          </tx:attributes>
        </tx:advice
    >

    Apparemment l'annotation @transactional ne supporte pas plusieurs transaction manager?
    trouvé dans: http://xocoatl.blogspot.com/2008/02/...th-spring.html
    Use explict AOP configuration in the Spring configuration file for declaring transaction boundaries. The Transactional annotation does not support multiple local transaction managers tied to different persistence units, so it cannot be used in the context of a reusable module.

  5. #5
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Salut,
    Une solution possible est de créer un proxy vers l'entityManager :
    En gros, un EntityManager qui route tous les appels de ses méthodes vers un autre entityManager, selon le besoin.

    Attention : j'ai jamais testé cette solution, et je ne suis mêm epas sûr que ça puisse marcher

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/09/2014, 22h28
  2. Réponses: 20
    Dernier message: 01/07/2014, 14h26
  3. Réponses: 4
    Dernier message: 03/11/2005, 13h40

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