Bonjour,
Je migre une application Hibernate Swing ver JEE standard, puis Spring.
Pour l'instant je ne sais pas si je vais garder la partie Swing.
J'ai pu la garder fonctionnelle,sans trop de mal.
Alors je la conserve.
J'ai un problème au niveau des DAO
J'ai pensé faire un DAO deux en 1.
Avec un constructeur sans argument qui passera par l'EntityManager, qui sera injecté, pour le JEE.
Et un constructeur avec comme argument SessionFactory, pour le JSE.
Si SessionFactory est non null, je demande une ssesion sinon je passe par l'entity manager.
J'ai fait ainsi :
Un classe abstraite
Et pour l'implémentation :
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 <table width="100%" border="0" cellspacing="0" cellpadding="0"><tr> <td style="border: 0; padding: 0; text-align: left">Code :</td> <td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> - <a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table> public abstract class AbstractDao { protected static Logger logger = Logger.getLogger("Log"); protected SessionFactory sessionFactory; // @PersistenceContext protected EntityManager entityManager; public Session getSession() { if (sessionFactory != null) { return sessionFactory.openSession(); } else { return entityManager.unwrap(Session.class); } } } </div>
Le but est de pouvoir appeler la session Hibernate, sans se soucier d'où elle viennent d'un contexte local ou serveur.
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 <table width="100%" border="0" cellspacing="0" cellpadding="0"><tr> <td style="border: 0; padding: 0; text-align: left">Code :</td> <td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> - <a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table> <pre class="bbcode_code" style="height:36px;">Insérer le code ici</pre> <pre class="bbcode_code" style="height:36px;">Insérer le code ici</pre> public class CompteDAO extends AbstractDao { public CompteDAO() { } public CompteDAO(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public Compte get(int id) { try (Session session = getSession()) { ... </div>
Mais je me demande si il n'y a pas une approche plus propre ?
N'y a-t-il pas une classe parente commune à EntityManager et SessionFactory sur laquelle je puisse invoquer un "getsession()" sans me poser de questions ?
Pour l'instant je n'ai pas commencé la partie JEE.
C'est pourquoi j'ai commenté l'obtention du contexte
Et en plus je ne sais pas si je pourrais laisser l'annotation sans que ça plante en JSE
Cordialement
Fabrice
Partager