Bonjour,
En écrivant les méthodes de manipulation de ma base de données via Hibernate, je me suis posé quelques questions qui m'ont un peu chamboulé.
J'écrivais initialement un delete de la maniète suivante :
Cela implique que je récupère dans la classe appelant cette méthode avec un try et un catch.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 public void insertPalette(Palette palette) throws Exception { Session session = this.getSession(); Transaction transaction = session.beginTransaction(); session.save(palette); transaction.commit(); session.close(); }
C'est déjà un premier choix.
Mais au final, j'aurais pu gérer directement l'erreur dans la classe.
J'ai en fait choisi de le gérer aux deux niveaux :
- au niveau de ce qu'on appellera ma classe DAO, qui gère la manipulation des données de la base
- au niveau de ma classe métier qui fait appelle à ma classe DAO pour savoir que faire en fonction de son résultat.
Cependant, je me demande comment gérer une exception.
Je m'expliquer, voici ma classe DAO réécrite :
Si la méthode
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
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 public void insertPalette(Palette palette) throws Exception{ Session session = null; Transaction transaction = null; /* récupération de la session */ try{ session = this.getSession(); } catch(HibernateException he){ System.out.println (" Impossible de récupérer la session hibernate"); System.out.println (" Erreur hibernate : " + he.toString()); throw new Exception(" Impossible d'insérer une palette dans la base !"); } /* début de la transaction */ try{ transaction = session.beginTransaction(); } catch(HibernateException he){ session.close(); // fermeture de la session System.out.println (" Impossible de démarrer une transaction hibernate"); System.out.println (" Erreur hibernate : " + he.toString()); throw new Exception(" Impossible d'insérer une palette dans la base !"); } /* insertion de la palette dans la base */ try{ session.save(palette); } catch(HibernateException he){ transaction.rollback(); // annulation de la transaction session.close(); // fermeture de la session System.out.println (" Erreur hibernate : " + he.toString()); throw new Exception(" Impossible d'insérer une palette dans la base !"); } /* validation de la transaction */ try{ transaction.commit(); } catch(HibernateException he){ transaction.rollback(); // annulation de la transaction session.close(); // fermeture de la session System.out.println (" Impossible de valider la transaction !"); System.out.println (" Erreur hibernate : " + he.toString()); throw new Exception(" Impossible d'insérer une palette dans la base !"); } /* fermeture de la session */ try{ session.close(); } catch(HibernateException he){ System.out.println (" Impossible de fermer la session !"); System.out.println ("Erreur hibernate : " + he.toString()); throw new Exception("Impossible d'insérer une palette dans la base !"); } }
échoue, je récupère l'erreur et j'en renvois une au métier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part this.getSession()
Pour celle là, aucun problème.
Par contre, pour la deuxième méthode, c'est déjà plus compliqué :
Si cette méthode échoue, je récupère l'exception, et je ferme la session ouverte.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 transaction = session.beginTransaction();
Cependant, si je teste l'ouverture de la session, je dois donc tester la fermeture de la session également.
Dois-je donc faire un try/catch du genre :
?
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 /* début de la transaction */ try{ transaction = session.beginTransaction(); } catch(HibernateException he){ try{ session.close(); // fermeture de la session } catch(HibernateException){ //gestion de l'erreur } System.out.println (" Impossible de démarrer une transaction hibernate"); System.out.println (" Erreur hibernate : " + he.toString()); throw new Exception(" Impossible d'insérer une palette dans la base !"); }
Si oui, cela complique énormément les choses, car j'aurais quasiment un code de longueur exponentielle !
L'option finally est elle faite pour gérer ce genre de problème ?
N'aurais-je pas interêt à placer toutes mes méthodes dans un unique try ?
Ce serait plus simple, mais cela m'empecherait de fermer une session éventuellement ouverte !
En réflchissant à tout ça, je m'emmêle les pinceaux, et j'ai besoin d'un avis confirmé pour me clarifier l'esprit.
Merci de me sortir de l'obsurité !
Partager