Ouvrir la session dans le modèle de vue
Je vous pose cette question, étant donné que j'ai choisi de cadres de développement de la JPA (Hibernate mise en œuvre de), au Printemps et en <insert framework MVC ici - Struts 1, Struts 2, Spring MVC, Rayures...>.
J'ai pensé un peu à propos des relations dans mon entité de couche - par exemple, j'ai une commande de l'entité qui a de nombreuses lignes de commandes. J'ai mis en place mon application afin qu'elle avec impatience charge les lignes de commande pour chaque commande. Vous pensez que c'est une manière paresseuse pour obtenir autour de l'initialisation des problèmes que j'aimerais trouver, si je devais me définir le parcours de la stratégie de faux?
La façon dont je le vois, j'ai les options suivantes lors de la récupération des entités et de leurs associations:
- Utiliser l'ouverture de Session Dans une Vue de modèle pour créer la session sur chaque demande et de valider la transaction avant de retourner la réponse.
- Mettre en œuvre un DTO (Data Transfer Object) de la couche de telle façon que chaque requête DAO j'execute renvoie la initialisé correctement DTO pour mes fins. Je n'aime pas vraiment cette option parce que dans mon expérience, j'ai trouvé qu'il crée beaucoup de passe-partout de copier le code et devient malpropre à maintenir.
- Ne correspondent pas toutes les associations en APC de façon à ce que toutes les requêtes que j'execute renvoie uniquement les entités, je suis intéressé par cette aura probablement besoin de moi pour avoir des Otd de toute façon et sera une douleur à maintenir et je pense que de défaites le but d'avoir un ORM en premier lieu.
- Avec impatience chercher tous (ou la plupart des associations) - dans l'exemple ci-dessus, toujours récupérer toutes les lignes de commande quand j'ai récupérer une commande.
Donc ma question est de savoir quand et dans quelles circonstances utilisez-vous, laquelle de ces options? Avez-vous toujours coller avec une seule façon de faire?
Je voudrais demander à un collègue, mais je pense que même si je l'ai mentionné le terme "Open Session in View" je voudrais être accueillis avec des regards vides 🙁 Ce que je suis vraiment à la recherche de voici quelques conseils d'une personne âgée ou très développeur expérimenté.
Merci les gars!
source d'informationauteur JMM
Vous devez vous connecter pour publier un commentaire.
J'ai résolu avec succès tous mes initialisation des problèmes avec Open Session In View -modèle (ie. le Printemps de la mise en œuvre). Les technologies que j'ai utilisé était exactement le même que vous avez.
L'utilisation de ce modèle me permet de pleinement la carte de l'entité relations et ne pas s'inquiéter de l'extraction de l'enfant entités dans le dao. La plupart du temps. Dans 90% des cas, le modèle résout l'initialisation des besoins dans la vue. Dans certains cas, vous aurez à "manuellement" initialiser les relations. Ces cas sont rares et toujours très très mappings dans mon cas.
Lors de l'utilisation d'Ouvrir le Gestionnaire d'Entité Dans la Vue modèle, il est important de définir les entités-relations, et en particulier la propagation transactionnelles et les paramètres correctement. Si ce ne sont pas configurés correctement, il y aura des erreurs liées à des séances à huis clos lorsqu'une entité est initialisées dans la vue et il échoue en raison de la session ayant été déjà fermé.
Je serait certainement aller avec l'option 1. Option 2 pourrait être nécessaire parfois, mais je ne vois absolument aucune raison d'utiliser l'option 3. L'Option 4 est aussi un non non. Avec impatience de récupérer tout ce qui tue la performance d'un point de vue que les besoins de liste de quelques propriétés de certains parents entités (les commandes dans son cas).
N+1 Selects
Au cours du développement, il y aura N+1 selects comme un résultat de l'initialisation de certaines relations dans la vue. Mais ce n'est pas une raison pour rejeter le modèle. Juste corriger ces problèmes dès qu'ils surviennent et avant de livrer le code de production. Il est aussi facile de résoudre ces problèmes avec OEMIV motif que c'est avec un tout autre motif: ajout de la bonne dao ou d'un service méthodes, fixer le contrôleur d'appeler une autre méthode de recherche, peut-être ajouter une vue de la base de données etc.
Open Session in View a quelques problèmes.
Par exemple, si la transaction échoue, vous savez peut-il trop tard au moment de la validation, une fois que vous êtes près de faire le rendu de votre page (peut-être la réponse déjà commis, de sorte que vous ne pouvez pas modifier la page !) ... Si vous aviez sais que l'erreur avant, vous aurait suivi un autre flux et finit par rendre une autre page...
Autre exemple, la lecture des données sur la demande peuvent s'adresser à de nombreux "N+1 sélectionnez" problèmesqui tuent vos performances.
De nombreux projets, utilisez le chemin suivant:
Pour éviter de créer des classes supplémentaires pour les Dto, vous pouvez charger les données à l'intérieur de l'entité objets eux-mêmes. C'est le point de l'ensemble de la POJO approche (utilise par les données modernes-l'accès des couches, et même l'intégration des technologies comme le Printemps).
J'ai utilisé avec succès l'ouverture de la Session en Vue de motif sur un projet. Cependant, j'ai lu récemment dans "le Printemps Dans la Pratique" d'un potentiel intéressant problème avec les lectures non reproductibles si vous gérez vos transactions sur une couche inférieure tout en gardant la session Hibernate ouvert dans la couche vue.
Nous avons réussi la plupart de nos opérations dans la couche de service, mais a gardé la session hibernate ouvert dans la couche vue. Cela signifiait que les paresseux lit dans la vue sont à l'origine de lecture séparée des transactions.
Nous avons réussi notre transactions dans notre service de couche pour minimiser la durée de transaction. Par exemple, certains de nos appels de service a entraîné à la fois une transaction de base de données et un appel de service web à un service externe. Nous ne voulons pas que notre transaction pour être ouvert lors de l'attente pour un appel de service web pour répondre.
Que notre système ne suis jamais allé dans la production, je ne suis pas sûr si il y avait de réels problèmes avec elle, mais je soupçonne qu'il y avait le potentiel pour le point de vue de tenter paresseusement charger un objet qui a été supprimé par quelqu'un d'autre.
Il y a certains avantages de DTO approche. Vous devez penser à l'avance quelles sont les informations dont vous avez besoin. Dans certains cas, cela va vous empêcher de la génération n+1 select. Il permet également de voir où utiliser le chargement agressif et/ou affichage optimisé.
Je vais aussi jeter mon poids en faveur de l'ouverture de Session dans la Vue modèle, ayant été dans le même bateau avant de.
Je travaille avec des Rayures sans ressort, et ont créé un filtre manuel avant qui a tendance à bien fonctionner. Codage opération logique sur le backend se transforme en désordre vraiment rapide comme vous l'avez mentionné. Avec impatience de récupérer tout devient TERRIBLE, comme vous carte plus les objets les uns aux autres.
Une chose que je tiens à ajouter que vous n'avez pas rencontré est Stripersist et Stripernate - Stripersist étant le plus JPA saveur - auto-hydratation des filtres qui prennent beaucoup de le travail de vos épaules.
Avec Stripersist vous pouvez dire des choses comme
/appContextRoot/actions/view/3
et il s'auto-hydrate la JPA Entité sur l'ActionBean avec l'id de 3 avant l'événement est exécuté.Stripersist est dans le bandes-paquet de trucs sur sourceforge. J'ai maintenant l'utiliser pour tous les nouveaux projets, comme c'est propre et facilement prend en charge plusieurs sources de données si nécessaire.
L'ordre et de l'Ordre des Lignes de composer un volume élevé de données? Ils ne prennent part à des processus en ligne où de réponse en temps réel est nécessaire? Si oui, vous pourriez envisager de ne pas utiliser le chargement agressif - il faire une grande diference de la performance. Si la quantité de données est petit, il n'y a pas de problème dans le chargement agressif.
Sur l'utilisation des Otd, il pourrait être une bonne mise en œuvre.
Si votre couche de gestion est utilisé en interne par votre propre application (j'.e une petite application web et sa logique métier), il serait probablement préférable d'utiliser vos propres entités dans votre point de vue avec open session in view patron, car il est plus simple.
Si votre entités sont utilisés par de nombreuses applications (j'.e une application backend de fournir un service dans votre société), il serait intéressant d'utiliser les Dto puisque vous exposez pas votre modèle à vos clients. L'exposant peut signifier que vous auriez un moment plus difficile la refactorisation de votre modèle, car il pourrait signifier la rupture des contrats avec vos clients. Un DTO le rendrait plus facile puisque vous avez une autre couche de
l'abstraction. Cela peut-être un peu étrange depuis EJB3 serait théoriquement d'éliminer la nécessité de l'Otd.