Comme vous le savez déjà peut être, les sessions Hibernate sont très
fortement couplées aux transactions : Hibernate ouvre et ferme les
sessions au début et à la fin d'une transaction. Lors du développement d'une
librairie (DAO), Je me suis posé la question "est il possible de ne pas
utiliser un contexte transactionnel pour gérer les sessions ?". En effet lors
de mes tests qui sont transactionnels, tout se passait bien mais lorsque
j'intégrais mon code dans un contexte non transactionnel et que je tentais de
récupérer des associations liées à une entité, j'avais des
lazyInitializationException
car les sessions était fermées.
j'avais alors plusieurs solutions :
- Utiliser le filtre Spring
Opensessioninviewfilter
, mais cela
rend ma librairie non portable car cela ne fonctionnera que dans un contexte
web
- Faire des méthodes ad'hoc pour récupérer l'entité ou l'entité avec ses
associations chargées (eager), mais au détriment d'un code moins lisible et où
il est facile de ne pas utiliser la bonne méthode
- Charger les associations directement (par configuration) avec
FetchType=Eager. pas assez performant !
- Utiliser les profiles de fectching
- Faire une gestion des session par thread.
Je vous propose de voir comment j'ai implémenté la dernière solution