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 :

Routage de session factory


Sujet :

Hibernate Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 16
    Points : 11
    Points
    11
    Par défaut Routage de session factory
    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

  2. #2
    Expert confirmé
    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
    Points : 4 141
    Points
    4 141
    Par défaut
    C'est à dire ?
    Tu veux faire quoi concrètement ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    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.
    ...

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2007
    Messages : 71
    Points : 62
    Points
    62
    Par défaut
    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...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    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.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2007
    Messages : 71
    Points : 62
    Points
    62
    Par défaut
    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é.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    On peut le faire sans probleme, mais le choix ne dépend pas de moi...

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2007
    Messages : 71
    Points : 62
    Points
    62
    Par défaut
    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...

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    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

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2007
    Messages : 71
    Points : 62
    Points
    62
    Par défaut
    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 :

    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;
    	}
    }
    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.

    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 !

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    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...

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2007
    Messages : 71
    Points : 62
    Points
    62
    Par défaut
    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.

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/04/2007, 14h56
  2. hibernate et session factory
    Par sandytarit dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 17/01/2007, 13h10
  3. 2 webapp, 2 sessions factory, 1 instance de jboss
    Par emilieax dans le forum Hibernate
    Réponses: 2
    Dernier message: 20/12/2006, 09h40
  4. Réponses: 1
    Dernier message: 18/08/2006, 14h49
  5. [Hibernate] Session Factory ThreadSafe
    Par K-Kaï dans le forum Hibernate
    Réponses: 6
    Dernier message: 03/07/2006, 10h55

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