Hibernate, iBatis, Java EE ou d'autres Java outil ORM
Nous sommes dans le processus de planification d'un grand, d'applications d'entreprise. Nous essayons de concentrer nos efforts sur l'évaluation de la mise en veille prolongée après éprouver les douleurs de l'environnement J2EE.
Il ressemble à la nouvelle API Java EE est plus simple. J'ai aussi lu quelques bonnes choses à propos de la mise en veille prolongée et iBatis. Notre équipe a peu d'expérience avec les cadres.
Il y a 5 principaux comparisong points que je voudrais déterminer
- Courbe d'apprentissage/Facilité d'Utilisation
- Productivité
- De La Maintenabilité, De La Stabilité
- Performance/Évolutivité
- Facilité de Dépannage
Si vous étiez à la gestion d'une équipe de ~6 développeurs J2EE expérience qui ORM outil utilisez-vous et pourquoi?
Vous devez vous connecter pour publier un commentaire.
Permettez-moi de prendre une fissure à ce. D'abord, j'ai écrit sur ce sujet dans À l'aide d'un ORM ou de la plaine SQL?. Spécifiquement pour répondre à vos points:
Courbe d'apprentissage/Facilité d'Utilisation
Ibatis est sur le SQL. Si vous connaissez SQL la courbe d'apprentissage pour ibatis est trivial. Ibatis n'certaines choses sur le dessus de SQL telles que:
que vous aurez toujours besoin d'apprendre, mais le plus grand obstacle est SQL.
JPA (qui comprend la mise en veille prolongée) d'autre part tend à s'éloigner de SQL et de présenter les choses dans un objet plutôt que d'une manière relationnelle. Comme Joel souligne cependant, les abstractions sont fuit et JPA n'est pas une exception. Faire JPA vous aurez toujours besoin de savoir sur les modèles relationnels, SQL, optimisation des performances des requêtes et ainsi de suite.
Alors que Ibatis va avoir simplement d'appliquer le SQL vous savez ou sont en apprentissage, JPA va vous obliger à savoir quelque chose d'autre: comment le configurer (XML ou annotations). Par cela, je veux dire à comprendre que les relations de clé étrangère sont une relation un-à-un, un-à-plusieurs ou plusieurs-à-plusieurs) d'un certain type, le type de cartographie, etc.
Si vous connaissez SQL, je dirais que la barrière à l'apprentissage de la JPA est en fait plus élevé. Si vous ne le faites pas, c'est plus d'un résultat mitigé avec JPA ce qui vous permet de reporter l'apprentissage du SQL pour une fois (mais il ne doit pas indéfiniment).
Avec JPA une fois que vous l'installation de votre entités et de leurs relations, puis d'autres les développeurs peuvent utiliser et n'avez pas besoin de tout savoir sur la configuration de JPA. Ce pourrait être un avantage, mais un développeur aura toujours besoin de savoir à propos de gestionnaires d'entités, la gestion des transactions, géré vs objets managés et ainsi de suite.
Il est intéressant de noter que JPA a aussi son propre langage de requête (JPA-SQL), dont vous aurez besoin pour savoir si oui ou non vous savez SQL. Vous trouverez des situations où JPA-SQL ne peuvent tout simplement pas faire des choses que SQL peut.
Productivité
C'est un dur à juger. Personnellement, je pense que je suis plus productif dans ibatis, mais je suis aussi très à l'aise avec SQL. Certains diront qu'ils sont plus productifs avec Hibernate, mais cela est probablement dû, au moins en partie-à une absence de familiarité avec le langage SQL.
Également la productivité avec JPA est trompeur, car vous aurez l'occasion rencontré un problème avec votre modèle de données ou de requêtes qui vous prend une demi-journée à une journée pour résoudre comme vous activer l'enregistrement et de regarder ce que SQL votre fournisseur JPA est de produire et ensuite, la combinaison de paramètres et appels à obtenir pour produire quelque chose de correct et performant.
Vous n'avez tout simplement pas ce genre de problème avec Ibatis parce que vous avez écrit sur le SQL vous-même. Vous de le tester en exécutant SQL à l'intérieur de PL/SQL Developer, SQL Server Management Studio, Navicat for MySQL ou quoi que ce soit. Une fois que la requête est juste, tout ce que vous faites est de mappage des entrées et des sorties.
Aussi j'ai trouvé JPA-QL pour être plus difficile que pur SQL. Vous avez besoin d'outils distincts pour passer JPA-QL pour voir les résultats et c'est quelque chose de plus que vous avez à apprendre. J'ai trouvé toute cette partie de la JPA plutôt maladroit et lourd, bien que certaines personnes l'aiment.
De La Maintenabilité, De La Stabilité
Le danger avec Ibatis ici est la prolifération du sens à votre équipe de développement peut simplement continuer à ajouter des objets de valeur et des requêtes comme ils en ont besoin plutôt que sur la recherche de la réutilisation alors que JPA a un entitty par table et une fois que vous avez cette entité, c'est tout. Nommé requêtes ont tendance à aller sur cette entité, qui sont difficiles à manquer. Des requêtes Ad-hoc peut encore être répété, mais je pense que c'est moins un problème potentiel.
Que le coût de la rigidité cependant. Souvent dans une application, vous aurez besoin de pièces et de morceaux de données provenant de différentes tables. Avec SQL c'est facile parce que vous pouvez écrire une seule requête (ou un petit nombre de requêtes) pour obtenir toutes les données d'un seul coup et le mettre dans un personnalisé des objets de valeur juste pour ce but.
Avec JPA vous vous déplacez jusqu'que la logique dans votre couche de gestion. Les entités sont tout ou rien. Maintenant, ce n'est pas strictement vrai. Divers JPA fournisseurs vous permettra de charger partiellement entités et ainsi de suite, mais même là, vous parlez de la même discret entités. Si vous avez besoin de données à partir de 4 tables que vous avez besoin de 4 entités ou vous avez besoin de combiner les données que vous voulez dans une sorte de coutume d'objet de valeur dans l'entreprise ou de la couche de présentation.
Une autre chose que j'aime à propos de ibatis est que tous vos SQL externe (dans des fichiers XML). Certains citent cela comme un inconvénient, mais pas à moi. Vous pouvez ensuite trouver des utilisations d'un tableau et/ou de la colonne relativement facile par la recherche de vos fichiers XML. Avec SQL intégré dans le code (ou, lorsqu'il n'y a pas de SQL), il peut être beaucoup plus difficiles à trouver. Vous pouvez également couper et coller SQL dans une base de données de l'outil et l'exécuter. Je ne peux pas exagérer assez combien de fois cela a été utile pour moi au fil des ans.
Performance/Évolutivité
Ici, je pense que ibatis gagne haut la main. C'est tout droit SQL et à faible coût. De par sa nature, JPA ne pourront tout simplement pas être en mesure de gérer le même niveau de latence ou de débit. Maintenant, ce que JPA a aller pour elle est que le temps de latence et de débit ne sont que rarement des problèmes. De systèmes de haute performance, toutefois, ne existe pas et aura tendance à défaveur plus lourd des solutions comme la JPA.
Plus avec ibatis vous pouvez écrire une requête qui retourne exactement les données que vous voulez exactement les colonnes dont vous avez besoin. Fondamentalement, il n'ya aucun moyen JPA peut battre (ou même match) qui, lorsqu'il est de retour entités discrètes.
Facilité de Dépannage
Je pense que c'est une victoire pour Ibatis trop. Comme je l'ai mentionné ci-dessus, avec JPA, vous aurez parfois de passer une demi-journée à l'obtention d'une requête ou d'une entité produire le SQL que vous voulez ou le diagnostic d'un problème où une transaction échoue parce que le gestionnaire de l'entité essayé de persister un objet non géré (ce qui pourrait être une partie d'un lot de travail où vous avez commis beaucoup de travail alors il serait peut-être pas évident à trouver).
Deux d'entre eux échoueront si vous essayez d'utiliser une table ou une colonne qui n'existe pas, ce qui est bon.
D'autres critères
Maintenant vous n'avez pas mentionné la portabilité comme l'un de vos exigences (sens de déplacement entre les fournisseurs de base de données). Il est intéressant de noter qu'ici, JPA a l'avantage. Les annotations sont moins mobiles que, disons, Hibernate, XML (par exemple la norme JPA annotations n'ont pas un équivalent pour Hibernate "native" ID type), mais deux d'entre eux sont plus mobiles que ibatis /SQL.
Aussi j'ai vu JPA /Hibernate utilisé comme une forme de portable DDL, ce qui signifie que vous exécuter un petit programme Java qui crée le schéma de base de données de configuration JPA. Avec ibatis vous aurez besoin d'un script pour chaque base de données.
La baisse de la portabilité est que JPA est, à certains égards, plus petit dénominateur commun, le sens de la pris en charge de comportement est en grande partie la commune de prises en charge des comportements à travers un large éventail de fournisseurs de bases de données. Si vous souhaitez utiliser Oracle Analytics dans ibatis, pas de problème. En JPA? Eh bien, c'est un problème.
Une simple règle de pouce entre iBatis et mise en veille prolongée, c'est que si vous voulez plus de SQL/vision relationnelle du monde, iBatis est mieux adapté; et pour les plus complexes de l'héritage de la chaîne, et moins direct, vue de SQL, Hibernate.
Les deux sont largement utilisés et solide, de bons cadres. Donc, je pense que les deux se serait probablement bien fonctionner. Peut-être la lecture d'un tutoriel pour les deux, voir si l'on sonne mieux que l'autre, et il suffit de choisir un.
Des choses à la liste, je ne pense pas que la performance qui est très différente -- goulot d'étranglement sera presque toujours à la base de données, pas de cadre. Pour les autres, je pense que les différents développeurs préfèrent l'un ou l'autre, c'est à dire il n'y a pas généralement acceptée de priorité (par iBatis vs Hibernate).
La solution qui vous allez avec dépend aussi de la façon dont conformes à vous de choisir (ou doivent) être avec Java EE spec. JPA est "la norme" pour l'accès aux données en Java EE systèmes, donc si vous êtes particulier sur les respectant, vous devriez l'utiliser (avec certaines réserves).
JPA est une normalisation de mapping objet-relationnel systèmes. Ainsi, il n'est pas de fournir une implémentation, il définit simplement une approche standardisée. Hibernate Entity Manager est un exemple de mise en œuvre.
Depuis JPA est une norme dans de multiples fournisseurs et depuis, il est encore assez nouveau, il manque un peu plus ésotérique que la fonctionnalité est utile dans certains cas d'utilisation (par exemple, un des Critères de l'API pour générer le SQL dynamique). Si vous allez avec JPA plan sur des situations où vous aurez née à utiliser Hibernate directement, ou même JDBC directement. Pour de telles situations, un générique DAO motif est très utile; vous pouvez modifier celui-ci: Générique Objets D'Accès Aux Données pour une utilisation en JPA & JDBC assez facilement.
JPA a certaines restrictions (en particulier si vous avez utilisé pour la mise en veille), et impose certaines approches sur vous qui sont difficiles pour les développeurs qui sont plus utilisés pour l'écriture de droite JDBC. Si vous êtes le champion de cette approche, assurez-vous de faire vos devoirs sur les avantages vs inconvénients de l'ORM vs JDBC.
Si vous allez avec JPA, une fois que vous avez atteint la courbe d'apprentissage qu'elle sera payante en termes de développement simple (surtout si vous mettre correctement en œuvre le précitées DAO schéma), mais aussi à s'multi-niveaux, la mise en cache des résultats de la requête. Si c'est fait correctement (un gros "si", je sais), je l'ai vu de fournir de beaux avantages.
Enfin, si vous avez un héritage du modèle de données que vous avez peu de souplesse avec, Hibernate (et JPA) vous donnera plus de maux de tête que peut-être la peine. Par exemple:
Pour ajouter une autre option de la liste... jeter un oeil à:
Ebean ORM (http://ebean-orm.github.io).
C'est la revendication principale serait plus simple, plus intuitive modèle de programmation que APC ou mise en veille prolongée. Plus précisément, il n'a pas une Session Hibernate ou l'EntityManager, pas détaché/objets attachés (pas de fusion, persistent, chasse), le chargement paresseux fonctionne, tout simplement.
... aka beaucoup plus simple à utiliser et à comprendre.
Vous pouvez également utiliser votre propre SQL avec Ebean (pour les requêtes, mises à jour, des procédures stockées) et de l'OMI, il correspond à Ibatis dans la facilité d'utilisation wrt à l'aide de votre propre SQL.
Si vous êtes à la recherche d'utiliser l'ORM dans Java SE, alors je vous suggère de vérifier.
Acclamations, Rob.
Nous sommes actuellement en train de travailler sur un projet qui utilise à la fois la mise en veille prolongée et ibatis.
Pourquoi utiliser hibernate ?
Il prend en charge notre modèle de domaine, les relations et l'héritage. Nous avons une assez complexe modèle de domaine et hiberante le supporte très bien.
Pas besoin de s'inquiéter à propos de l'écriture des insertions, des mises à jour etc.
Ibatis est utilisé uniquement pour la vue. Il y a des questions et nous avons vue des objets(semblables à des modèles de domaine, mais pas les modèles de domaine) qui sont mappés avec des requêtes. Ibatis renvoie les données dans la vue obejct vous le souhaitez sans vous soucier de la lecture de jeu de résultats qui vous avez à gérer dans Spring JDBC.
Pourquoi avons-nous qu'au lieu d'utiliser les requêtes HQl ou Spring JDBC ?
Le domaine est si complexe et lors du rendu de la vue , nous ne les calculs , group by et des tonnes de SQL natif fonctions. nous faisons tout ce que, dans la requête, l'utilisation de requêtes dynamiques , gestion des conditions dans ibatis et de nettoyer lumière le poids de l'objet.
Fait beaucoup plus de sens si vous avez descendre dans plusieurs couches pour extraire les données en veille prolongée
Donc, en fonction de votre situation , vous pouvez utiliser seulement un, deux ou peut-être aucun.
Mais certainement, mise en veille prolongée n'est pas quelque chose que vous ne pouvez pas vivre sans.
Être conscient que l'utilisation de JPA/Hibernate (et probablement la plupart des autres solutions d'ORM) en non-trivial applications multi-thread peut rapidement devenir un véritable PITA parce que les sessions de base de données doivent être confinés à un seul thread (objets de Session ne sont pas thread-safe). Ajouter le chargement paresseux et le fait que les entités persistantes peuvent appartenir à plus d'une session active...et vous êtes dedans pour un enfer d'un tour...
Vous pouvez avoir un coup d'oeil à La gestion de Session de l'utilisation d'Hibernate dans un *multi-thread* application Swing (ou juste la recherche pour "hibernate multi-threaded').
Ma règle d'or (YMMV): Si l'application ne se prête pas à une sorte de demande/réponse de cycle (comme un service web par exemple) , vous pouvez probablement mieux d'utiliser quelque chose d'autre.
Bien sûr, une autre solution serait de conception de l'application d'une manière qui contourne l'encadrement des limitations. Évolution d'une application de conception afin que je puisse obtenir un cadre XYZ de travail laisse un mauvais arrière-goût bien que.
De toute façon, mon de 0,02 $
Je pense que nous devrions prendre en considération la raison principale pour laquelle nous sommes à l'aide de Java (ou OO).
Le système doit être souple et permettre des modifications constantes de la spécification (ce qui arrive très souvent dans la vraie vie). Sinon, on devrait avoir programmé en C, parce qu'il est beaucoup plus rapide.
Je pense que la meilleure pile pour les applications web Java EE: JPA - EJB JSF (avec extension de contexte de persistance de la conversation étendue).
JSF est aussi plus lent que pure JSP/Servlet, mais il est plus rapide à se développer.
JPA est plus difficile à apprendre, mais il est plus rapide à développer (vous savez: RAD) et les changements n'ont pas de gros (sujettes à erreur de copier-coller) l'impact. Ajouter une nouvelle colonne dans votre bien le plus utilisé de l'entité, et que vous devez mettre à jour tous les états iBatis ...
JPA ne marche pas très bien sur tous les cas, mais il couvre la plupart d'entre eux, et il vous permet également de brancher Requête Native au lieu de JPQL, sans modification du code. Mais si vous vous retrouvez à écrire trop de Requête Native de votre projet pourra être mieux iBatis.
Et que pour la performance, la JPA est aussi performant si vous comprenez la façon dont les choses traduire de SQL, et si vous vous mettez à faire ce qu'il faisait le mieux, si vous vous mettez à faire quelque chose qui n'est pas confortable pour lui, il va générer trop de requêtes. Il n'y a pas de magie ! Vous devez être au courant de la requête générée, pas aveuglément espère que vous pouvez prendre la voie facile lorsque certains cas complexe peut apparaître.
Également si les développeurs ont toutes les fonctionnalités de SQL qu'ils vont écrire trop de requêtes complexes de processus d'affaires de la logique, au lieu de l'avoir dans un endroit centralisé, vous aurez un peu de logique métier dans SQL, certains dans des EJB. JPA doit être pour la persistance de votre modèle, pas pour la Logique Métier.
Les critères de la Requête est également pas de match pour assurer la protection des nomatterhowcomplex de requêtes dynamiques.
Si vous êtes en effet un nouveau projet, vous pouvez utiliser hibernate, mais sachez que la courbe d'apprentissage est assez raide.
Si vous avez une base de données existante, vous êtes beaucoup mieux de avec iBatis, parce qu'après une journée que vous êtes productif et après deux jours de plus, vous pouvez tout savoir sur elle.
Une chose que vous devez considérer est que le hibernate critères de l'api est excellent pour créer des requêtes personnalisées, qui, selon votre demande, peut être un bon argument pour elle.
Si vous n'avez pas un bon modèle d'objet, je ne vois pas l'intérêt de mettre en veille prolongée. Vous avez certainement le "relationnel" dans ORM, puisque vous avez une base de données relationnelle, mais "l'objet" est la clé. Pas d'objets, pas de la moraine d'oak ridges. Je pense que le mappage 1:1 entre les objets et les tableaux, sans plus riche comportement d'objet, ne justifie pas de l'ORM. Bâton avec JDBC ou iBatis si c'est votre situation.
Je vous conseille d'aller avec JPA et selon (fortement!) sur la durée/la portée de votre projet, vous pourriez aussi bien regarder dans JPA2, car il fournit quelques-unes des fonctionnalités manquantes de JPA (un très beau Requête API par exemple).
Aller avec hibernate. Votre projet va certainement croître plus en plus tard et de l'investissement (sur l'apprentissage de la mise en veille prolongée) paieront d'une façon ou d'une autre.
Avez-vous essayé de vous expliquer POURQUOI même utiliser un outil ORM avant de décider lequel utiliser? Si vous avez des gens dans votre équipe qui sait SQL, consultez bâton de JDBC.