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
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>
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
 
<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>
Le but est de pouvoir appeler la session Hibernate, sans se soucier d'où elle viennent d'un contexte local ou serveur.
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