Hibernate vs JPA vs JDO - avantages et inconvénients de chacun?
Je suis familier avec l'ORM comme un concept, et je l'ai même utilisé nHibernate il y a plusieurs années pour un .Un projet de réseau; cependant, je n'ai pas suivi le sujet de l'ORM en Java et je n'ai pas eu la chance d'utiliser un de ces outils.
Mais, maintenant, j'ai peut-être la chance de commencer à utiliser certains outils ORM pour l'une de nos applications, dans une tentative de s'éloigner de la série de l'héritage de services web.
Je vais avoir un moment difficile à dire la différence entre la JPA spec, ce que vous obtenez avec la veille prolongée de la bibliothèque elle-même, et ce JDO a à offrir.
Donc, je comprends que cette question est un peu plus ouvert, mais j'ai espoir d'obtenir quelques avis sur:
- Quels sont les avantages et les inconvénients de chacun?
- Qui suggéreriez-vous pour un nouveau projet?
- Certaines conditions, quand il serait logique d'utiliser un framework vs les autres?
Vous devez vous connecter pour publier un commentaire.
Quelques remarques:
De l'OMI, je vous recommande de mise en veille prolongée.
Il y a eu quelques commentaires /questions sur ce que vous devriez faire si vous besoin à utiliser Hibernate des fonctionnalités spécifiques. Il y a beaucoup de façons de regarder cela, mais mon conseil serait:
Si vous n'êtes pas inquiet par la perspective d'un vendeur de cravate, alors faites votre choix entre mettre en veille prolongée et d'autres JPA et JDO implémentations y compris les différents fournisseurs d'extensions spécifiques à votre prise de décision.
Si vous êtes inquiet par la perspective d'un vendeur de cravate, et vous ne pouvez pas utiliser JPA sans avoir recours à un fournisseur d'extensions spécifiques, puis ne pas utiliser JPA. (Idem pour JDO).
En réalité, vous aurez probablement besoin de compromis combien vous êtes inquiet par le vendeur de cravate-dans le rapport combien vous avez besoin de ces fournisseurs d'extensions spécifiques.
Et il y a aussi d'autres facteurs, comme la façon dont vous /votre personnel connaît les technologies respectives, combien les produits coût des licences, et dont l'histoire vous croyez à propos de ce qui va se passer dans le futur pour JDO et JPA.
Assurez-vous d'évaluer les DataNucleus mise en œuvre de JDO. Nous avons commencé avec mise en veille prolongée, car il semble être si populaire, mais assez vite rendu compte que ce n'est pas un 100% transparent persistance de la solution. Il y a de trop nombreuses mises en garde, et la documentation est plein de "si vous rencontrez cette situation, alors vous devez écrire du code comme ceci" qui a emporté le plaisir de la liberté de la modélisation et de codage, mais nous voulons. JDO a jamais m'a amené à adapter mon code ou mon modèle pour l'obtenir "travailler correctement". Je peux juste de conception et de code simple Pojo comme si j'allais les utiliser en mémoire seulement, pourtant je peut persister de façon transparente.
L'autre avantage de JDO/DataNucleus sur hibernate, c'est que ce n'est pas le moment de l'exécution de la réflexion à la verticale et est plus efficace en terme de mémoire, car il utilise le temps de construction de byte code de mise en valeur (peut-être ajouter 1 sec de votre temps de construction pour un projet de grande envergure) plutôt que de hibernate moment de l'exécution de réflexion alimenté modèle de proxy.
Une autre chose que vous pourriez trouver ennuyeux avec Hibernate est que d'une référence, vous avez ce que vous pensez est l'objet... c'est souvent un "proxy" de l'objet. Sans le bénéfice de byte code amélioration du modèle de proxy est nécessaire pour permettre le chargement de la demande (c'est à dire d'éviter de tirer dans votre ensemble de l'objet graphique lorsque vous tirez un haut niveau d'objet). Être prêt à remplacer equals et hashcode l'objet parce que vous pensez que vous êtes le référencement est souvent juste un proxy pour cet objet.
Voici un exemple de frustrations que vous obtenez avec Hibernate que vous ne serez pas obtenir avec JDO:
http://blog.andrewbeacock.com/2008/08/how-to-implement-hibernate-safe-equals.html
http://burtbeckwith.com/blog/?p=53
Si vous aimez le codage de 'solutions' alors, bien sûr, Hibernate est pour vous. Si vous appréciez propre, pur, orienté objet, basé sur les modèles de développement où vous passez tout votre temps sur la modélisation, de conception et de codage et rien de tout cela sur laide des solutions de contournement, puis passer quelques heures de l'évaluation de JDO/DataNucleus. Les heures investies sera remboursé au centuple.
Mise À Jour Février 2017
Pour un certain temps maintenant DataNucleus' implémente la persistance JPA standard en plus de la JDO persistance standard, de sorte que le portage existant JPA projets de mise en veille prolongée pour DataNucleus devrait être très simple et vous pouvez obtenir toutes les prestations citées ci-dessus de DataNucleus avec très peu de code à modifier, le cas échéant.
Donc, en termes de la question, le choix d'une norme particulière, JPA (SGBDR seulement) vs JDO (SGBDR + Pas de SQL + ODBMSes + d'autres), DataNucleus prend en charge à la fois, Hibernate est limitée à JPA seulement.
Performance de Hibernate DB mises à jour
Une autre question à considérer lors du choix d'un ORM est l'efficacité de sa sale mécanisme de vérification - qui devient très important quand il en a besoin pour construire le SQL pour mettre à jour les objets qui ont changé dans la transaction en cours - surtout quand il y a beaucoup d'objets.
Il y a une description technique détaillée de Hibernate sale mécanisme de contrôle dans cette SORTE de réponse:
JPA HIBERNATE insérer très lent
J'ai récemment évalué et choisi la persistance cadre d'un projet java et mes conclusions sont les suivantes:
Ce que je vois, c'est que le soutien en faveur de JDO est principalement:
et le soutien en faveur de JPA est principalement:
Je vois beaucoup de pro-JPA postes de JPA développeurs qui n'ont manifestement pas utilisé JDO/Datanucleus offrant la faiblesse des arguments pour ne pas utiliser de JDO.
Je suis aussi voir beaucoup de messages de JDO les utilisateurs qui ont migré vers JDO et sont beaucoup plus heureuses.
Dans le respect de la JPA être de plus en plus populaire, il semble que cela est dû en partie en raison de SGBDR fournisseur de soutien, plutôt que ce soit techniquement supérieur. (On dirait VHS/Betamax pour moi).
JDO et c'est l'implémentation de référence de Datanucleus est clairement pas mort, comme indiqué par Google de l'adoption des ti pour la FGA et de développement actif sur le code-source (http://sourceforge.net/projects/datanucleus/).
J'ai vu un certain nombre de plaintes au sujet de JDO en raison de bytecode amélioration, mais pas d'explication mais pourquoi c'est mauvais.
En fait, dans un monde qui devient de plus en plus obsédée par les solutions NoSQL, JDO (et le datanucleus mise en œuvre) semble être un beaucoup plus sûr pari.
J'ai commencé à utiliser JDO/Datanucleus et l'ont mis en place de sorte que je puisse passer facilement à l'aide de db4o et mysql. Il est utile pour le développement rapide de l'utilisation db4o et ne pas avoir à trop se soucier de la DB du schéma, puis, une fois que le schéma est stabilisé à déployer une base de données. Je suis également convaincu que, plus tard, j'ai pu déployer tout ou partie de mon application en FGA ou de profiter de stockage distribué/carte-de réduire la hbase /hadoop /cassandra sans trop de refactoring.
J'ai trouvé le premier obstacle de la mise en route avec Datanucleus un peu délicat - La documentation sur le datanucleus site web est un peu difficile à obtenir dans - les tutoriels ne sont pas aussi faciles à suivre que je l'aurais aimé. Ayant dit que, le plus détaillé de la documentation sur l'API et de la cartographie est très bon une fois passé la courbe d'apprentissage.
La réponse est: cela dépend de ce que vous voulez. Je préfère avoir plus propre code, sans vendor lock-in, plus pojo, axés sur la nosql options versets plus populaire.
Si vous voulez le chaud pointilleux sentiment que vous faites la même chose que la majorité des autres développeurs/les moutons, choisissez JPA/hibernate. Si vous voulez vous entraîner dans votre domaine, test drive JDO/Datanucleus et faire votre propre idée.
Je dirais non plus! L'utilisation de Ressort de DAO
JdbcTemplate
avecStoredProcedure
,RowMapper
etRowCallbackHandler
à la place.Mon expérience personnelle avec mise en veille prolongée, c'est que le temps économisé à l'avant est plus que compensé par les jours sans fin que vous passerez en bas de la ligne en essayant de comprendre et de déboguer les problèmes comme inattendu mise à jour en cascade les comportements.
Si vous utilisez un relationnel ensuite le plus proche de votre code est à elle, plus vous avez de contrôle. Le printemps de la couche DAO permet un contrôle précis de la cartographie de la couche, tout en éliminant le besoin de code réutilisable. Aussi, il s'intègre dans le Printemps de la couche de transaction qui signifie que vous pouvez très facilement ajouter (via AOP) compliqué transactionnelle comportement, sans cette intrusion dans votre code (bien sûr, vous obtenez ceci avec Hibernate trop).
JDO n'est pas mort en fait donc veuillez vérifier l'exactitude de vos informations.
JDO 2.2 a été publié en octobre 2008
JDO 2.3 est en cours de développement.
Ce est développée de manière ouverte, en vertu de Apache. Plus de mises à jour que JPA a eu et ses ORM spécification est encore à l'avance de même le JPA2 proposé caractéristiques
JDO est d'avoir des fonctionnalités avancées de JPA voir http://db.apache.org/jdo/jdo_v_jpa.html
Je suis en utilisant JPA (OpenJPA la mise en œuvre d'Apache qui est basé sur le KODO JDO base de code qui est de 5 ans et+ et extrêmement rapide/fiable). À mon humble avis, toute personne qui vous dit de contourner les specs, c'est de vous donner de mauvais conseils. J'ai mis le temps et n'était certainement récompensé. Soit avec JDO ou JPA vous pouvez changer de fournisseur avec un minimum de modifications (JPA a orm cartographie on parle alors moins d'une journée pour éventuellement changer de fournisseur). Si vous avez+ de 100 tables comme je le fais c'est énorme. Plus vous obtenez built0in la mise en cache par le groupe sage cache d'expulsions et de son tout bon. SQL/Jdbc est très bien pour la haute performance des requêtes, mais persistance transparente est de loin supérieure pour la rédaction de votre algorithmes et les données d'entrée de routines. Je n'ai que environ 16 requêtes SQL dans tout mon système (50k+ lignes de code).
Quelqu'un qui dit que JDO est mort, est un astroturfing FUD monger et ils le savent.
JDO est bel et bien vivant. La spécification est encore plus puissant, mûr et avancé que le beaucoup plus jeune et contraint JPA.
Si vous voulez vous limiter uniquement à ce qui est disponible dans l'APP standard, vous pouvez écrire à la JPA et l'utilisation DataNucleus comme une haute performance, plus transparente, plus la persistance de la mise en œuvre que les autres implémentations de JPA. Bien sûr DataNucleus met également en œuvre la JDO de la norme, si vous voulez la flexibilité et l'efficacité de la modélisation que JDO apporte.
J'ai regardé en moi-même et ne peut pas trouver une forte différence entre les deux. Je pense que le choix est mise en œuvre que vous utilisez. Pour moi j'ai été compte tenu de la DataNucleus plate-forme de données de magasin agnostique de la mise en œuvre des deux.
J'ai utilisé Hibernate JPA (mise en œuvre) et JPOX (JDO mise en œuvre) dans le même projet. JPOX travaillé ok, mais elle a rencontré des bugs assez rapidement, là où certains de Java 5 fonctionnalités de langage, il n'a pas d'appui à l'époque. Il avait des problèmes pour jouer gentil avec les transactions XA. J'ai été de générer le schéma de base de données à partir de la JDO objets. Il voulait se connecter à une base de données à chaque fois ce qui est gênant si votre connexion Oracle arrive pas.
Nous avons ensuite passé à Hibernate. Nous avons joué autour avec seulement l'aide de pure JPA pour un certain temps, mais nous avions besoin d'utiliser certaines des caractéristiques spécifiques à Hibernate de faire de la cartographie. Exécute le même code sur plusieurs bases de données est très facile. Hibernate semble en cache les objets de façon agressive ou juste étrange comportement de mise en cache à la fois. Il y a quelques DDL constructions Hibernate ne peut pas gérer et de sorte qu'ils sont définis dans un fichier supplémentaire qui est exécuté pour initialiser la base de données. Quand j'ai couru dans Hibernate problème il y a souvent beaucoup de gens qui ont rencontré le même problème qui fait appel à google pour des solutions plus facile. Enfin, Hibernate semble être bien conçu et fiable.
Certains autres intervenants ont suggéré de simplement à l'aide de SQL. Le véritable assassin de cas d'utilisation pour le mapping objet-relationnel est d'essais et de développement. Les bases de données qui sont créées pour traiter de gros volumes de données sont généralement coûteux et ou ils sont difficiles à installer. Ils sont difficiles à tester avec. Il y a beaucoup de Java en mémoire les bases de données qui peuvent être utilisés pour faire des tests, mais sont généralement inutiles pour la production. Être capable d'utiliser un vrai, mais limitée de la base de données, permettra d'augmenter la productivité de développement de code et de fiabilité.
J'ai fait un échantillon d'une WebApp en Mai 2012 qui utilise JDO 3.0 & DataNucleus 3.0 prendre un coup d'oeil comment nettoyer c'est:
https://github.com/TorbenVesterager/BadAssWebApp
D'accord c'est peut-être un peu trop propre, parce que je utiliser le Pojo à la fois pour la base de données et le JSON client, mais c'est amusant 🙂
PS: Contient quelques SuppressWarnings annotations (développé à l'Ide, 11)