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 ?
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 ?
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();
...
Le plus simple c'est plusieurs fichiers de conf avec des noms différents.
@+
Tout de suite, j'utilise une classe HibernateUtil (d'après un exemple trouvé sur le site d'hibernate)
Mon fichier hibernate.cfg.xml semble être utilisé par défaut...
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 ]"); } } }
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 ?
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();
...
Ok, je vais essayer ça... et un grand merci pour vos réponses !
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 :
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.
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 ]"); } } }
Que peut-il bien se passer ?
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").
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"...
No collection found ca veut dire que tes mappings sont mauvais.
verifies que les objets existent en base.
@+
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 !
Bon ça y est ça marche... on dirait que Tomcat s'était un peu mélangé les pinceaux !
Grand merci à tous !
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager