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