En effet, l'envoi de Proxies éventuellement non initialisés, en particulier de collections, dans la couche de vue et le déclenchement du chargement d'Hibernate à partir de là peuvent être troublants tant du point de vue des performances que de la compréhension.
Comprendre :
L'utilisation d'OSIV "pollue" la couche de vue avec des préoccupations liées à la couche d'accès aux données.
La couche de visualisation n'est pas préparée à gérer un HibernateException
ce qui peut arriver lors d'un chargement paresseux, mais vraisemblablement la couche d'accès aux données l'est.
Performance :
OSIV a tendance à ignorer le chargement correct des entités - vous avez tendance à ne pas remarquer que vos collections ou entités sont initialisées paresseusement ( peut-être N+1 ). Plus de commodité, moins de contrôle.
Mise à jour : voir L'anti-modèle OpenSessionInView pour une discussion plus large sur ce sujet. L'auteur énumère trois points importants :
- chaque initialisation paresseuse vous obtiendra une requête, ce qui signifie que chaque entité aura besoin de N + 1 requêtes, où N est le nombre d'associations paresseuses. Si votre écran présente des données tabulaires, la lecture du journal d'Hibernate est un gros indice que vous ne faites pas comme il faut
- cela va complètement à l'encontre de l'architecture en couches, puisque vous vous salissez les ongles avec la DB dans la couche de présentation. Il s'agit d'un contre-sens conceptuel, je pourrais donc m'en accommoder, mais il y a un corollaire
- enfin, si une exception se produit lors de la récupération de la session, elle se produira pendant l'écriture de la page : vous ne pouvez pas présenter une page d'erreur propre à l'utilisateur et la seule chose que vous pouvez faire est d'écrire un message d'erreur dans le corps de la page.