-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 4 posts ] 
Author Message
 Post subject: Tester dynamiquement une configuration
PostPosted: Sat Feb 25, 2006 2:15 pm 
Newbie

Joined: Sat Dec 03, 2005 7:31 pm
Posts: 12
Location: Toulouse, France
Code:
Hibernate : 3.0
SGBD : Multiples


Bonjour à tous,

J'ai beau chercher en français et en anglais partout sur le web, je n'arrive pas à trouver de solution à mon problème, et j'ai épluché la documentation sans succès...

En fait j'aimerais que mon application puisse se connecter à différents SGBDs au choix de l'utilisateur. Pour cela, l'utilisateur saisit les informations de connexions nécessaires. Puis j'effectue un test de connexion via JDBC pour m'assurer que le serveur est accessible, et que la base existe.

Mon problème vient de la configuration dynamique d'Hibernate.

Dans un premier temps, je crée une instance de Configuration, je lui attribue les paramètres comme indiqué dans la documentation. Ensuite, j'appelle sa méthode buildSessionFactory() pour récupérer la SessionFactory qui sera utilisée ensuite par le reste de l'application.

J'ai encadré ce code avec un try/catch de sorte de pouvoir récupérer des exceptions et réaliser les traitements adéquats, mais même avec une configuration volontairement incorrecte, aucune exception n'est récupérée. Les exceptions ne sont lancées que lorsque j'apelle un session.load().

L'exemple qui m'intéresse le plus et celui d'une base de données qui ne contient pas les bonnes tables (ou qui est vide). L'idée est de détecter ce fait via l'initialisation d'Hibernate, puis de proposer à l'utilisateur de générer dynamiquement la base de données (en utilisant hbm2ddl) pour enfin lancer l'application.

Est-il possible d'effectuer ce genre de tests dynamiquement ?

Merci d'avance.

_________________
IceScrum project : Scrum projects management tool


Top
 Profile  
 
 Post subject:
PostPosted: Mon Feb 27, 2006 5:42 am 
Senior
Senior

Joined: Tue May 10, 2005 9:00 am
Posts: 125
Ca risque d'être joyeux à faire :)

Je ne connais pas de moyen qui permette à Hibernate de checker toutes ses tables comme un grand (il le fait à la demande au fur et à mesure des requeste SQL).

Cependant, si tu veux tester un db, j'imaginerais un truc comme çà

buildSessionFactory()
sessionFactory.getAllClassMetadata();
iteration sur les class metadata pour récupérer table et field associé.
Pour chaque table, faire un session.createSQLQuery() pour checker la table :/


Top
 Profile  
 
 Post subject:
PostPosted: Mon Feb 27, 2006 7:51 am 
Newbie

Joined: Sat Dec 03, 2005 7:31 pm
Posts: 12
Location: Toulouse, France
Merci du conseil, je vais essayer ça ce soir (j'ai pas commit mes modifs et je suis pas sur mon poste :S).

En fait j'avais déjà essayé plusieurs méthodes du style buildSomething() de la SessionFactory, mais ça ne retourne pas d'exception non plus.

Sinon j'avais la solution de me rabattre sur le test d'existence des tables depuis JDBC, mais c'est vraiment fastidieux et mauvais pour la maintenance (si les mappings changent, il faudra penser à ce testeur)...

Je vais voir si ça marche et si c'est pas trop lourd en chargement. Je vous tiendrai au courant, je pense que je ne suis pas le premier à me poser ce genre de problème ;)

_________________
IceScrum project : Scrum projects management tool


Top
 Profile  
 
 Post subject:
PostPosted: Tue Feb 28, 2006 6:23 pm 
Newbie

Joined: Sat Dec 03, 2005 7:31 pm
Posts: 12
Location: Toulouse, France
Bon après avoir posté sur le forum commun avec 1 crédit, j'ai eu une réponse rapide et efficace ;)

En fait il faut utiliser la classe SchemaValidator (utilitaire dans le package hbm2ddl).

Voici mon extrait de code qui réalise ce que je voulais faire :



Code:
   /**
    * Fonction qui vérifie que la configuration donnée soit applicable à la base de données qu'elle désigne.
    * Sinon propose à l'utilisateur de la générer automatiquement.
    * @param parent Fenêtre parent qui servira à l'affichage des méthodes.
    * @param cfg Configuration d'Hibernate à tester
    * @return boolean true si la configuration est bonne, false sinon
    */
   public static boolean loadHibernate (JFrame parent, ConnectionConfiguration cfg) {
      
      // Initialise la configuration
      Configuration hibCfg = new Configuration();
      
      // Affecte les propriétés de connexion
      hibCfg.setProperty("hibernate.connection.url",cfg.getConnectionUrl());
      hibCfg.setProperty("hibernate.connection.driver_class",cfg.getJdbcDriver());
      hibCfg.setProperty("hibernate.connection.username",cfg.getUser());
      hibCfg.setProperty("hibernate.connection.password",cfg.getPassword());
      hibCfg.setProperty("hibernate.connection.pool_size","0");
      
      // Affecte les propriétés du dialecte
      hibCfg.setProperty("hibernate.dialect",cfg.getHibernateDialect());
      hibCfg.setProperty("hibernate.use_outer_join","true");
      hibCfg.setProperty("hibernate.transaction.factory_class","org.hibernate.transaction.JDBCTransactionFactory");
      
      // Affecte les propriétés de debug
      hibCfg.setProperty("hibernate.show_sql","true");
      hibCfg.setProperty("hibernate.use_sql_comments","true");
      hibCfg.setProperty("hibernate.format_sql","true");
      
      // Affecte les fichiers de mapping
      hibCfg.addResource("resources/hibernate/E_Project.hbm.xml");
      hibCfg.addResource("resources/hibernate/E_ApesImportedActivity.hbm.xml");
      hibCfg.addResource("resources/hibernate/E_ProductBacklogItem.hbm.xml");
      hibCfg.addResource("resources/hibernate/E_Release.hbm.xml");
      hibCfg.addResource("resources/hibernate/E_RemainingEstimation.hbm.xml");
      hibCfg.addResource("resources/hibernate/E_Sprint.hbm.xml");
      hibCfg.addResource("resources/hibernate/E_SprintBacklogItem.hbm.xml");
      hibCfg.addResource("resources/hibernate/E_Team.hbm.xml");
      hibCfg.addResource("resources/hibernate/E_User.hbm.xml");
      
      // Valide le schema à partir de la configuration
      SchemaValidator validator = new SchemaValidator(hibCfg);
      try {
         parent.setCursor(new Cursor(Cursor.WAIT_CURSOR));
         validator.validate();
         parent.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
      
      // Le schéma n'a pas été validé, il faut le générer
      } catch (HibernateException e) {
         // TODO Fred : Bundle
         // Demande à l'utilisateur s'il veut générer la base de données automatiquement
         if ( JOptionPane.showConfirmDialog(parent,"La base de données 'TOTO' est vide (ou incompatible). Voulez-vous la générer automatiquement ?","Base de données incorrecte",JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION ) {
            try {
               SchemaExport exporter = new SchemaExport(hibCfg);
               parent.setCursor(new Cursor(Cursor.WAIT_CURSOR));
               exporter.execute(false,true,false,false);
               parent.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
               
            } catch (Exception e2) {
               // TODO Fred : Bundle
               JOptionPane.showMessageDialog(parent,"Impossible de générer la base de données : " + e2.getMessage(),"Erreur",JOptionPane.ERROR_MESSAGE);
            }
            
         // Si l'utilisateur ne génère pas la base, retourne false pour annuler l'opération
         } else {
            return false;
         }
      }
      
      // S'il n'y a pas eu de problème, affecte la SessionFactory à HibernateUtil
      HibernateUtil.setSessionFactory(hibCfg.buildSessionFactory());
      
      // Crée le super utilisateur avec le mot de passe par défaut
      Session session = HibernateUtil.currentSession();
      E_User superUser = new E_User();
      superUser.setLogin("admin");
      superUser.setPassword("IceScrumAdministrator");
      superUser.setFirstName("Administrator");
      superUser.setSurname("Administrator");
      superUser.setEmail("");
      session.save(superUser);
      
      // Retourne true pour indiquer que tout est ok
      return true;
   }


Une remarque importante : il faut hibernate version 3.1 (la 3.0 ne contient pas cet utilitaire).

Voilà j'espère que ça vous servira ;)

A bientôt,
Fred.

_________________
IceScrum project : Scrum projects management tool


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 4 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.