Lorsque Hibernate ferme une session, le but de close est essentiellement de fermer la connexion sous-jacente et de nettoyer le cache de premier niveau. Pourquoi la chasse ne se produit pas automatiquement ici?Pourquoi hiberner session.close() ne vide pas automatiquement les données?
2
A
Répondre
7
D'un point de vue transactional, flushing est très différent de fermer la session et flush
devrait se produire à l'intérieur des limites d'une transaction (ou à commit
temps):
Fin d'une session implique généralement quatre distincts phases:
- la séance de chasse
- valider la transaction
- fermer la session
- gérer les exceptions
D'autre part, la fermeture d'une session (et la connexion sous-jacente) doit être effectuée après une opération a pris fin (le comportement d'une transaction en attente lors de la fermeture d'une connexion est undefined).
Il n'y a donc aucune raison de faire quoi que ce soit à proximité et de promouvoir une mauvaise sémantique et il est parfaitement logique d'avoir des opérations distinctes.
Pour résumer:
- juste utiliser une transaction et une bonne démarcation que vous êtes censé (et la session à obtenir rincée consacrer du temps si nécessaire, en fonction du FlushMode).
- utilisez
SessionFactory#getCurrentSession()
et vous ne devrez pas vous-mêmeSession#close()
(leSession
sera fermé pour vous au moment de la validation).
@Pascal, je pense que vous n'avez pas vraiment répondu à la question de l'op. Il n'a pas suggéré que le rinçage et la fermeture de la session sont les mêmes mais plutôt que si la session est sale, il devrait aussi être appelé lors de la fermeture de la session. Cela a du sens pour moi si on utilise FlushMode.Auto et qu'ils mettent à jour un objet persistant alors je pense qu'Hibernate devrait prendre soin de vider l'objet au moment où il le pense, Hibernate ne devrait pas ignorer le changement. Ce qui je pense pourrait arriver si flush n'est pas appelé. – Ittai
@Ittai J'ai clarifié ma réponse (ce qui n'était pas assez clair) et j'ai essayé d'expliquer pourquoi je ne suis pas d'accord avec vous. –
@Pascal, merci pour vos précisions mais je ne suis toujours pas d'accord. En ce qui concerne Item2, ce n'est pas pertinent dans mon cas car j'utilise le pattern session-per-request et parfois j'ai besoin que la session reste ouverte après un commit. En ce qui concerne Item1, c'est exactement ce que je ne me sens pas à l'aise avec - Pourquoi utiliser une transaction pour une seule mise à jour? Je vois une transaction comme un moyen d'assurer la cohérence sur quelques commandes différentes (les regrouper en une unité de travail). Mais quand il n'y a qu'une seule commande, pourquoi devrions-nous utiliser une transaction? (BTW, je l'habitude d'utiliser JDBC tout le temps et cela pourrait affecter mes concenptions). – Ittai