Question

est-il un moyen vraiment pratique pour éviter d'utiliser DTO, lorsque les données passant par les méthodes de service transactionnels soutenus par Hibernate? En d'autres termes, sont DTO la seule solution non-aki pour éviter les problèmes d'initialisation paresseux?

Je pense que les deux alternatives populaires à DTO et les raisons pour lesquelles je ne suis pas vraiment comme eux sont:

  1. Open Session in View modèle. Ce que je n'aime pas que je voudrais garder les méthodes de service vraiment transactionnel (à savoir la session Hibernate est engagée et fermée lors de la sortie de la méthode). Ceci est principalement parce que je voudrais ne pas avoir à se soucier de transactions si je par exemple besoin de publier le service en tant que service Web plus tard.

  2. objets défilants domaine / d'affaires grâce à des méthodes de service au lieu de DTO et les attributs chargement complet nécessaires / propriétés. Ceci est un peu mieux. Cependant, dans une hiérarchie d'objets de domaine non trivial avec les relations d'entités compliquées l'fetching désireux doit arrêter quelque part. Et quand il le fait, je ne vois pas comment cela ne serait pas très rapidement se transformer en un hackaton complet remplaçant entités faisant référence ids dans tous les sens.

Suis-je manque quelque chose ou sont DTO en fait la seule approche solide du point de vue de la maintenabilité?

Était-ce utile?

La solution

La seule façon de vraiment utiliser les entités bout à bout est d'utiliser quelque chose d'un peu plus sophistiqué que OpenSessionInView. Dans mon expérience, vous allez devoir gérer la session de mise en veille prolongée manuellement au niveau de l'application. OpenSessionInView ne vous donnera la même session pour une demande. Après cela, vous aurez besoin d'être constamment refixer à la session en cours. Jetez un oeil à Seam et des conversations, ou mettre en œuvre votre propre gestion Hibernate session. Nous gérons nos sessions manuellement sur la base quand un assistant commence et se termine et utiliser Spring AOP pour attacher des sessions aux discussions à droite juste à temps (sessions sont pas thread-safe, pas un bon mélange avec AJAX)

WebServices d'autre part certainement vont avoir besoin d'une certaine forme de DTO. Je ne vois pas un moyen de contourner cela. Les entités peuvent ressembler POJO mais ne sont pas vraiment, les sérialisation peuvent aller de difficile à presque impossible. Il suffit de créer DTO qui cadrent avec l'objectif de la méthode de service et être fait avec elle.

Personnellement, je ne pense pas que le modèle DTO est terrible, si vous êtes juste faire un site web, il est possible d'aller de bout en bout avec des entités et il peut même vous acheter un peu de performance, mais si vous souhaitez une architecture plus souple , le bâton avec DTO.

Autres conseils

Référentiels, services et contrôleurs devraient être les lieux traitant de votre noyau d'application (Session Hibernate peut certainement être utilisé comme la totalité de votre couche dépôt, si vous le souhaitez).

Vues ne sont pas censés être traiter avec votre noyau d'application, le modèle de domaine. Ils ne devraient pas avoir affaire avec les objets vivants, mais avec un non-vivant, la représentation sur mesure des objets vivants. Les vues sont censés être remis uniquement les données dont ils ont besoin, dans le format particulier ils en ont besoin. Vous devez construire DTO pour votre point de vue. Ce modèle est également connu comme modèle Voir, pour contraster avec le modèle de domaine.

Pour vous rendre la vie plus facile, il peut y avoir des bibliothèques ou des cadres qui peuvent automatiquement des objets carte de votre modèle de domaine à vos objets de modèle de vue, et le dos. Dans .NET, il est un framework open source appelé AutoMapper actuellement en développement; Je ne sais pas ce qu'il ya pour Java.

Si vous détendant votre obligation de fermer la session, vous pouvez toujours utiliser la session ouverte en vue et engager tout simplement dans vos transactions de services. La session sera toujours disponible pour paresseux, mais toutes vos d'extraction transactions sera complète. Mais si vous allez passer à un service Web, alors vous devez charger désireux toutes vos entités de toute façon. DTO simplement vous forcer consciemment charge et désireux d'éviter la paresse accidentelle.

Ainsi, la ligne de fond, si vous faites attention, vous pouvez sauter les DTO dans les deux environnements, mais je ne reviendrais probablement en tenir à la session ouverte en vue et l'inquiétude au sujet des services Web quand ils deviennent en fait une exigence.

J'aime l'idée de DTO, mais je me sentais toujours qu'ils ne sont pas très bien accepté ou aimé par d'autres développeurs depuis la mise en œuvre de cette approche correctement tout le long de la base de données nécessite généralement beaucoup d'efforts. Voilà pourquoi j'ai créé entité Blaze-Persistence Vues qui vous permettent de modèle OTD que les interfaces qui correspondent au modèle d'entité JPA d'une manière efficace. Vous pouvez appliquer une vue de l'entité à une requête et la requête sera adaptée d'une manière qu'il ne chercher l'état réellement nécessaire, plutôt que de tout l'état et la carte que Java.

En utilisant des vues de l'entité que vous n'avez pas besoin de la séance publique en vue anti-modèle, parce que la structure désirée est chargée avec impatience. Comme il n'y a pas d'objets entité concernée, il y aura également pas de problèmes de chargement paresseux.

Étant donné que le modèle de l'entité est souvent si semblable au modèle DTO premiers stades de développement, je vois souvent les développeurs sauter simplement créer un modèle DTO séparé comme ils essaient d'éviter les tracas. Dès que les préoccupations transversales comme l'audit, des statistiques ou dénormalisations terres dans le modèle d'entité ou la quantité de données dans le modèle de l'entité se développe beaucoup plus grand que ce que vous avez réellement besoin pour les cas d'utilisation de l'entité, les développeurs des problèmes.

Vous allez surement comme un Blog poster sur cette question je l'ai écrit il y a quelque temps.

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