Blog de David MASCLET

Aller au contenu | Aller au menu | Aller à la recherche

mercredi 13 octobre 2010

Hibernate : différence entre get() et load()

Si vous êtes un utilisateur d'Hibernate, que ce soit avec Spring ou pas, vous êtes vous déjà posé la question de savoir quelles sont les différences entre session.load() et session.get(). Comprendre les différences permet souvent d'optimiser les accès à la base de données.

Lire la suite...

mercredi 6 octobre 2010

Gérer les sessions Hibernate sans transaction

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

Lire la suite...