Question

Je sais qu’il s’agit d’une question subjective, mais pourquoi Hibernate semble-t-il conçu pour des sessions de courte durée? En général, dans mes applications, je crée des DAO pour résumer ma couche de données, mais comme je ne peux pas prédire comment les objets d'entité vont être utilisés, certaines de ses collections sont chargées paresseux, ou devrais-je dire que le chargement échoue une fois la session fermée.

Pourquoi ne l'ont-ils pas conçu de manière à ouvrir automatiquement la session ou à laisser les sessions toujours ouvertes?

Était-ce utile?

La solution

Lorsque vous quittez la limite de votre transaction, vous ne pouvez plus accéder à la base de données sans démarrer une nouvelle transaction. Avoir des transactions à long terme "juste au cas où" est une mauvaise chose (tm).

Je suppose que vous souhaitez charger un objet paresseux depuis votre vue: consultez ici pour certaines options. Je préfère définir exactement la quantité de mappage d'objets qui sera renvoyée par mes méthodes de façade de session. Je trouve que cela facilite les tests unitaires et les performances de ma couche métier.

Autres conseils

J'ai travaillé sur une application de bureau utilisant EJB et Hibernate. Nous avons dû définir lazy = false partout, car lorsque les objets sont sérialisés, ils ne peuvent plus être récupérés à partir du backend. C'est comme ça que ça se passe, malheureusement.

Si les performances vous intéressent, vous pouvez utiliser la mise en cache sur le backend pour que vos extractions non paresseuses ne soient pas aussi pénibles.

Vous recherchez le modèle OpenSessionInView, qui est essentiellement un filtre conceptuel (et parfois implémenté en tant que filtre de servlet) qui détecte le moment où une session doit être rouverte de manière transparente. Plusieurs frameworks l'implémentent pour qu'il le gère automatiquement.

J'écris une application de bureau, l'utilisation d'un filtre n'est donc pas applicable.

Les connexions sont une ressource rare qui doit être recyclée dès que vous avez fini de les utiliser. Si vous utilisez également le pool de connexions, en obtenir un autre quand vous en avez besoin devrait être rapide. C’est l’architecture que vous devez utiliser pour adapter les sites Web - même si vous êtes une application de bureau, leurs cas d’utilisation se concentrent probablement sur des sites évolutifs.

Si vous examinez MS ADO.NET, vous constaterez que la même chose est de garder les connexions ouvertes pendant un court laps de temps: ils ont tout un modèle hors ligne pour mettre à jour les données déconnectées, puis s’appliquer à une base de données lorsque vous êtes prêt.

Hibernate est conçu pour mapper des objets sur des tables de base de données relationnelle. Cela accomplit très bien ce travail. Mais, ça ne peut pas plaire à tout le monde tout le temps. Je pense qu’il est assez complexe d’apprendre comment fonctionne l’initialisation, mais une fois que vous avez compris, cela a du sens. Je ne sais pas si c'était nécessairement "conçu" spécifiquement pour vous mettre en colère, c'est juste la façon dont les choses se sont passées.

Si cela allait rouvrir magiquement des sessions dans des applications autres que Web, je pense que la complexité de l’apprentissage du cadre en dépasserait de loin les avantages.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top