Je souhaiterais mettre en place un routage de sessionFactory mais je ne sais pas par où commencer. Quelq'un pourrait-il me donner quelques élèments car je n'ai rien trouver sur google.
Merci
Je souhaiterais mettre en place un routage de sessionFactory mais je ne sais pas par où commencer. Quelq'un pourrait-il me donner quelques élèments car je n'ai rien trouver sur google.
Merci
C'est à dire ?
Tu veux faire quoi concrètement ?
En fait, l'entreprise pour laquelle je travaille veut déployer une seule application.
Les utilisateurs se connectant à celle ci sont router vers une base ou une autre suivant leur profil.
Dans un premier temps, j'ai utilisé le routage de datasource, comme décrit ici http://blog.interface21.com/main/200...ource-routing/. Cependant, ceci ne marche uniquement que si les tables des deux bases de données ont le même nom, et appartiennent au même schémas. Après le développement complet de l'application, il s'avère que le nom des tables, ainsi que leur shéma peuvent être différent d'une base à l'autre (chose qui n'a pas été dit avant)
L'entreprise voulant absolument ne deployer qu'une seule application, je souhaiterai effectuer un routage de session de factory (ce qui me permettrai d'etre totalement indépendant du MPD). J'utilise le framework Spring 2.0, et le routage de Session Factory n'est pas natif dans Spring.
Je sais cependant qu'il y a moyen de se débrouiller en utilisant différentes astuces (notamment l'interface InvocationHandler, les factoryBean...). Avez vous déja utilisé le routage de sessionFactory.
En pratique : je suis un utilisateur belge, ma session factory pointe vers une base de données belge. Par code, je précise le nom des schémas, et des fichiers belges.
je suis un utilisateur francais, ma session factory pointe vers une base francaise. Par code, je précise le nom des schémas, et des fichiers francais.
...
Je suis en train d'avoir un problème similaire sur un autre poste (http://www.developpez.net/forums/sho...66#post2554766) même si ma problématique n'est pas de la même ampleur.
Tu dis que les tables dans les bases n'ont pas les mêmes noms, cela implique donc un mapping d'Hibernate différent, non ? Les différences au niveau de ton application s'arrêtent-elles au niveau du mapping, ou remontent-elles plus haut (la couche DAO, la couche Métier) ?
Une idée serait, en fonction du profil de ton utilisateur (que tu dois pouvoir déterminer très haut dans ton architecture) de faire appel à l'une ou l'autre des couches métier (ou DAO). Un simple IF dans une des premières classes appelées permettrait ainsi d'appeller un bean ou un autre, configuré avec une sessionFactory différente par Spring.
Ceci dit, étant encore peu expérimenté dans des architectures d'envergure, je suis peut-être complètement à côté de la plaque...
En fait, on peut modifier les fichiers de mapping par code (nom des schémas et tables). Dans mon cas précis, il n'y aura juste que le nom des schémas qui pourront etre modifié. En finalité, il y aura une base de donnée avec une nom de table associé à un nom de schéma, et par code, on précisera le nom du shéma dans tous les fichiers de mapping hbm.
Ta réponse n'est pas dénuer de sens, au contraire. Mais on ne veut pas doubler les couches DAO. La seule chose qui change d'un profil et d'un autre est la sessionFactory déclaré via Spring MVC.
Oui, je me doute que doubler les DAO n'est pas forcément la solution qui sera la première à être mise en avant (bizarrement)J'espérais simplement que l'application soit déjà suffisament dissociée pour pouvoir faire ce genre de chose...
Mais étant donné que ce n'est pas le cas, je crois que je ne vais pas pouvoir apporter mon aide plus loin. Désolé.
On peut le faire sans probleme, mais le choix ne dépend pas de moi...
A oui, je me doute que c'est tout à fait possible, mais s'il faut doubler tous les mapping, tous les DAO, mettre les conditions au niveau du métier pour choisir un DAO ou un autre, je me met à la place du chef de projet, je regarde le coût... et je pleure.
Pour continuer dans la bidouille (avant de trouver une solution propre et professionelle), est-ce qu'il y a moyen de créer un proxy qui contient les deux sessionsFactory et que tu pourrais initialiser avec l'une ou l'autre en fonction du profil ?
En fonction du profil, dans ta couche la plus haute possible, tu initialises ta sessionFactory perso (qui garde la session dans une variable statique par exemple), et tu injectes cette classe perso par Spring dans les métier et/ou DAO...
c'est exactement ce que l'on veut faire... Mais, existe-t-il une bidouille comme tu dis...
Une session factory abstraite "routant" vers telles ou telles sessionfactory en fonction d'une clé qu'on lui passe (dans un thread Local). C'est le mm principe que le routage dynamiquee de datasource.
Sur le net, j'ai rien trouvé concernant cette idée
Je dois avouer que je n'en sais rien.
Cependant, en y réfléchissant, cela ne doit pas être très compliqué à faire soi-même. Le seule problème que je vois actuellement, est que si tu fais un sessionFactory contenant la session courante dans une variable statique, tu pourrais avoir des problèmes entre les différents appels de ton application.
Un exemple de début d'idée pourrait être :
Il suffit de faire un setProfil dès que tu le connais. Et tes objets pourront ensuite utiliser une instance de cette classe (sous forme de bean injecté) pour récupérer la bonne session.
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 public class MaSessionFactory { private static SessionFactory maFactoryFrance = new (...); private static SessionFactory maFactoryBelgique = new (...); private static Session _session = null; public static void setProfil(String profil){ if(profil.equals("FR")){ _session = maFactoryFrance.openSession(); } else if(profil.equals("BE")){ _session = maFactoryBelgique.openSession(); } } public Session getSession(){ return _session; } }
Cependant cela sous-entend que tes objets DAO passent directement par la session, et s'abstraient de l'utilisation des objets HibernateDAOSupport (à moins de s'arranger pour que cette classe implémente la classe SessionFactory de Hibernate, en lui ajoutant simplement un setProfil, et qu'elle soit donc injectable dans les transactionManager ou autres...).
De plus je pense qu'il va y avoir un problème si plusieurs appels sont faits simultanément à ton application, à moins de limiter la portée de cette classe à la session (Web) courante.
Ceci dit, ce n'est que de la bidouille, et j'encourage vivement ceux qui ont une autre solution à la proposer !
Ok, merci,je vais proposer cette solution à notre architecte technique mais le fait de passer les objets DAO par la session ne va pas être apprécié, je pense...
Essaye de voir si tu ne peux pas la faire hériter de SessionFactory, ce qui te permettrait d'utiliser les HibernateTemplate. Mais là il faut un peu plus étudier le truc.
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