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.