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).
Questions connexes
- 1. Pourquoi la chaîne vide ne correspond-elle pas à Seq.empty?
- 2. @Transactional ne fonctionne pas avec le printemps et hiberner
- 3. mysqli_fetch_assoc vide les données?
- 4. Pourquoi PHP n'appelle pas automatiquement les constructeurs parents?
- 5. JPA 1.0 ou hiberner?
- 6. vide while ne pas vérifier l'état
- 7. jpa 2 et hiberner ensemble + hiberner types personnalisés + printemps
- 8. pourquoi ne retourne pas les permutations correctes!
- 9. Pourquoi le GC ne dispose-t-il pas automatiquement les membres de ma classe?
- 10. Pourquoi le compilateur C# ne déduit-il pas automatiquement les types dans ce code?
- 11. Pourquoi BindingSource = newBindingSource pas actualiser les données
- 12. Pourquoi ApplicationSettingsBase.Reset() vide-t-il les PropertyValues?
- 13. JAXB: Chaîne vide ne produit pas l'élément vide
- 14. comment faire pour hiberner
- 15. Les flux C++ ne lisent pas la ligne vide
- 16. Pourquoi les interfaces ne sont pas [Serializable]?
- 17. Pourquoi les états visuels ne fonctionnent pas?
- 18. htc files: Pourquoi ne pas les utiliser?
- 19. is_dir ne reconnaît pas les répertoires. Pourquoi?
- 20. DoEvents ne fait pas les événements ... Pourquoi?
- 21. pourquoi les menus ne sont-ils pas gonflés pour vous?
- 22. FilterExpression ne fonctionne pas? Pourquoi?
- 23. SQLAlchemy avec plusieurs clés primaires ne précise pas automatiquement les
- 24. XNA ne charge pas les textures du modèle automatiquement
- 25. ASP.NET MVC2 projet vide ne pas Chargement
- 26. Grails Webflow ne se rechargent pas automatiquement
- 27. comment changer automatiquement les données de ne pas utiliser la page Web ouverte pour Per heure
- 28. Formulaire ne transmettant pas les données, PHP
- 29. ContentPresenter ne montrant pas Usercontrol, pourquoi pas?
- 30. Windows Le service ne démarre pas automatiquement
@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