Bonjour,
Depuis que j'utilise Hibernate, j'utilise une classe écrite par hennebrueder pour gérer la sessionFactory. Cette classe permet d'utiliser une sessionFactory dans l'application (la classe utilise une sessionFactory static).
Mon application java non web que je suis en train d'écrire doit interroger une base de données et récupérer toutes les entrées d'une table. Ensuite elle doit parcourir toutes ses entrées et effectuer des opérations sur certaines. Ces entrées sont liées à d'autres tables, donc au fur et à mesure du parcours, j'ai besoin d'accéder à des propriétés venant d'autres tables. Donc jusqu'à la fin du parcours des entrées, je ne peux pas fermer la session en cours.
Je n'aurais pas de difficulté si je ne devais pas durant ce parcours effectuer des opérations d'écriture dans la base. D'une part, je dois mettre à jour les objets que je parcours, et d'autre part, entrer des informations dans une table (ajouter des traces d'exécution dans une table spécifique). Mon problème est que si j'utilise la même session et que je commit mes modifications au fur et à mesure, le commit ferme la session (donc mon parcours s'arrête).
Quelle est donc la meilleure pratique pour gérer les sessions hibernates ? dois-je utiliser plusieurs sessions ? une pour la parcours, une pour les modifications, une pour mes traces d'exécution ? dois-je utiliser la même pour tout et un flush() suffira ?
Code:
public class InitSessionFactory {
private static org.hibernate.SessionFactory sessionFactory;
public static SessionFactory getInstance() {
if (sessionFactory == null)
initSessionFactory();
return sessionFactory;
}
public Session getCurrentSession() {
return sessionFactory.getCurrentSession();
}
private static synchronized void initSessionFactory() {
[...]
sessionFactory = cfg.buildSessionFactory();
[...]
}
}
Mes appels à la session :
Code:
this.HibSession = InitSessionFactory.getInstance().getCurrentSession();
Transaction Tx = this.HibSession.getTransaction();
if (!Tx.isActive()) {
Tx = this.HibSession.beginTransaction();
}