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

Hibernate Java Discussion :

Accès à plusieurs bases de données


Sujet :

Hibernate Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 51
    Points : 35
    Points
    35
    Par défaut Accès à plusieurs bases de données
    Bonjour,

    J'utilise Hibernate et je cherche à déclarer plusieurs sources de données correspondant à des bases de données différentes. J'ai déclaré plusieurs "session-factory" mais rien à faire, ça ne marche pas !

    Est-ce que quelqu'un a une idée ?

  2. #2
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 37
    Points : 41
    Points
    41
    Par défaut
    Je n'ai jamais essayé de faire cela mais je pense que cela doit etre possible.

    Tu dois peut etre utiliser deux fichiers de configuration différents, 1 pour chaque connexion :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Configuration configuration_db1 = (new Configuration()).configure(pathDeMonFichierDeConf1);
    SessionFactory _factory1 = configuration_db1.buildSessionFactory();
     
    Configuration configuration_db2 = (new Configuration()).configure(pathDeMonFichierDeConf2);
    SessionFactory _factory2 = configuration_db2.buildSessionFactory();
    ...

  3. #3
    Membre expérimenté
    Avatar de RanDomX
    Profil pro
    sans
    Inscrit en
    Mars 2003
    Messages
    579
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mars 2003
    Messages : 579
    Points : 1 407
    Points
    1 407
    Par défaut
    Le plus simple c'est plusieurs fichiers de conf avec des noms différents.

    @+

  4. #4
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 51
    Points : 35
    Points
    35
    Par défaut
    Tout de suite, j'utilise une classe HibernateUtil (d'après un exemple trouvé sur le site d'hibernate)

    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
     
    public class HibernateUtil {
     
        private static final SessionFactory sessionFactory;
     
        static {
            try {
                sessionFactory = new Configuration().configure().buildSessionFactory();
            } catch (HibernateException ex) {
                throw new RuntimeException("Exception building SessionFactory: " + ex.getMessage(), ex);
            }
        }
        public static final ThreadLocal session = new ThreadLocal();
     
        public static Session currentSession() throws HibernateException {
            Session s = (Session) session.get();
            // Open a new Session, if this Thread has none yet
            if (s == null) {
            	System.out.println("[ OUVERTURE DE LA CONNEXION A LA BASE DE DONNEES ]");
                s = sessionFactory.openSession();
                session.set(s);
            }
            return s;
        }
     
        public static void closeSession() throws HibernateException {
            Session s = (Session) session.get();
            session.set(null);
            if (s != null){
                s.close();
                System.out.println("[ FERMETURE DE LA CONNEXION A LA BASE DE DONNEES ]");
            }
        }
    }
    Mon fichier hibernate.cfg.xml semble être utilisé par défaut...

    Si j'ai bien compris, je vais déclarer les fichiers de config hibernate à utiliser (1 par base) et créer une deuxième classe du même genre que HibernateUtil pour ma deuxième connexion.

    C'est bien ça ?

  5. #5
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 37
    Points : 41
    Points
    41
    Par défaut
    hibernate.cfg.xml est bien le fichier de config utilisé par défaut, mais tu peux renseigner le nom que tu veux.

    Tu peux garder ta Classe HibernateUtil en y ajoutant une deuxieme instance de SessionFactory !

    voici comment, tu peux proceder avec 2 fichiers de config:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    URL configFileURL = HibernateUtil.class.getResource("/hibernate1.cfg.xml");
    Configuration configuration1 = (new Configuration()).configure(configFileURL);
    _maSesionFactory1 = configuration1.buildSessionFactory();
     
    configFileURL = HibernateUtil.class.getResource("/hibernate2.cfg.xml");
    Configuration configuration2 = (new Configuration()).configure(configFileURL);
    _maSesionFactory2 = configuration2.buildSessionFactory();
    ...

  6. #6
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 51
    Points : 35
    Points
    35
    Par défaut
    Ok, je vais essayer ça... et un grand merci pour vos réponses !

  7. #7
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 51
    Points : 35
    Points
    35
    Par défaut
    Rien à faire, je n'arrive pas à le faire fonctionner...

    J'ai modifié la classe HibernateUtil suivante, qui est censée me donner l'accès à deux bases de données :

    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
     
    public class HibernateUtil {
     
    	private static final SessionFactory sessionFactory1;
    	private static final SessionFactory sessionFactory2;
     
    	static {
    		try {
     
    			URL configFileURL1 = HibernateUtil.class.getResource("hibernate1.cfg.xml");
    			sessionFactory1 = new Configuration().configure(configFileURL1).buildSessionFactory();
     
    			URL configFileURL2 = HibernateUtil.class.getResource("hibernate2.cfg.xml");
    			sessionFactory2 = new Configuration().configure(configFileURL2).buildSessionFactory();
     
    		} catch (HibernateException ex) {
    			throw new RuntimeException("Exception building SessionFactory: " + ex.getMessage(), ex);
    		}
    	}
     
    	public static final ThreadLocal session1 = new ThreadLocal();
    	public static final ThreadLocal session2 = new ThreadLocal();
     
    	public static Session getSession1() throws HibernateException {
    		Session s = (Session) session1.get();
    		// Open a new Session, if this Thread has none yet
    		if (s == null) {
    			System.out.println("[ OUVERTURE DE LA CONNEXION A LA BASE DE DONNEES 1 ]");
    			s = sessionFactory1.openSession();
    			session1.set(s);
    		}
    		return s;
    	}
     
    	public static void closeSession1() throws HibernateException {
    		Session s = (Session) session1.get();
    		session1.set(null);
    		if (s != null){
    			s.close();
    			System.out.println("[ FERMETURE DE LA CONNEXION A LA BASE DE DONNEES 1]");
    		}
    	}
     
    	public static Session getSession2() throws HibernateException {
    		Session s = (Session) session2.get();
    		// Open a new Session, if this Thread has none yet
    		if (s == null) {
    			System.out.println("[ OUVERTURE DE LA CONNEXION A LA BASE DE DONNEES 2 ]");
    			s = sessionFactory2.openSession();
    			session2.set(s);
    		}
    		return s;
    	}
     
    	public static void closeSession2() throws HibernateException {
    		Session s = (Session) session2.get();
    		session2.set(null);
    		if (s != null){
    			s.close();
    			System.out.println("[ FERMETURE DE LA CONNEXION A LA BASE DE DONNEES 2 ]");
    		}
    	}
    }
    L'accès à la base 1 est OK, mais je n'arrive jamais à accéder à la deuxième base... pour info, les 2 bases sont PostgreSQL.

    Que peut-il bien se passer ?

  8. #8
    Membre expérimenté
    Avatar de RanDomX
    Profil pro
    sans
    Inscrit en
    Mars 2003
    Messages
    579
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mars 2003
    Messages : 579
    Points : 1 407
    Points
    1 407
    Par défaut
    il te faut deux sessions factory.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    sessionFactory1 = new Configuration().configure("nomdetonfichierdeconfhibernatedansleclasspath").
     
    sessionFactory2 = new Configuration().configure("nomdetonautrefichierdeconfhibernatedansleclasspathavecunnomdifferent").

  9. #9
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 51
    Points : 35
    Points
    35
    Par défaut
    C'est pourtant bien ce que j'ai fait...

    Ou alors que je me sois trompé dans le fichier server.xml de Tomcat... au sujet des 2 datasources ? Pourtant elles semblent bien être trouvées.

    Sur la 2e base, Tomcat me retourne l'erreur "NoCollectionFound"...

  10. #10
    Membre expérimenté
    Avatar de RanDomX
    Profil pro
    sans
    Inscrit en
    Mars 2003
    Messages
    579
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mars 2003
    Messages : 579
    Points : 1 407
    Points
    1 407
    Par défaut
    No collection found ca veut dire que tes mappings sont mauvais.

    verifies que les objets existent en base.

    @+

  11. #11
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 51
    Points : 35
    Points
    35
    Par défaut
    Ils existent d'ailleurs pour vérifier que le mapping était bon, j'ai dupliquer la table utilisée de la 2e base vers la 1ere et ça marchait... J'y comprend plus rien !

  12. #12
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 51
    Points : 35
    Points
    35
    Par défaut
    Bon ça y est ça marche... on dirait que Tomcat s'était un peu mélangé les pinceaux !

    Grand merci à tous !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Limiter la taille d'une ou plusieurs bases de données
    Par Thierry8 dans le forum Administration
    Réponses: 7
    Dernier message: 12/03/2006, 23h51
  2. Réponses: 3
    Dernier message: 08/12/2005, 19h19
  3. Requête sur plusieurs bases de données
    Par Oluha dans le forum ASP
    Réponses: 8
    Dernier message: 14/10/2005, 14h57
  4. connexion a plusieurs bases de données oracle
    Par tarik75 dans le forum JDBC
    Réponses: 1
    Dernier message: 06/07/2005, 13h33
  5. triggers sur plusieurs bases de données
    Par Shabata dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/05/2004, 10h02

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