2009-12-28 9 views

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:

  1. 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).
  2. utilisez SessionFactory#getCurrentSession() et vous ne devrez pas vous-même Session#close() (le Session sera fermé pour vous au moment de la validation).
+0

@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

+1

@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. –

+0

@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