178 votes

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 voulez-vous suggérer pour un nouveau projet?
  • Certaines conditions, quand il serait logique d'utiliser un framework vs les autres?

112voto

toolkit Points 27248

Quelques remarques:

  • JDO et JPA sont les deux spécifications, pas implémentations.
  • L'idée est que vous pouvez permuter les implémentations JPA, si vous limitez votre code pour utiliser la norme JPA. (Idem pour JDO.)
  • Hibernate peut être utilisé comme un exemple de mise en œuvre de la JPA.
  • Cependant, Hibernate fournit une API native, avec des caractéristiques ci-dessus et au-delà de la JPA.

IMO, je vous recommande de mise en veille prolongée.


Il y a eu quelques commentaires / questions à propos de ce que vous devriez faire si vous avez besoin d'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 à la façon dont beaucoup 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.

69voto

Volksman Points 1146

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 causé moi de régler 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.

54voto

Tom Points 1079

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 avant tout:

  • vous pouvez utiliser des sources de données sql, db4o, hbase, ldap, bigtable, couchdb (plugins pour cassandra) etc.
  • vous pouvez facilement passer de l'un sql à la non-sql source de données et vice-versa.
  • aucun des objets proxy et donc moins de douleur en ce qui concerne hashcode() et equals() implémentations
  • plus POJO et donc moins de solutions de contournement nécessaire
  • prend en charge plus de relations et les types de champ

et le soutien en faveur de la JPA est avant tout:

  • de plus en plus populaire
  • jdo est mort
  • ne pas utiliser de pseudo-code binaire d'amélioration de la

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 de voir un grand nombre 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 que cela dépend de ce que vous voulez. Je préfère avoir plus propre code, il n'-vendeur-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.

40voto

oxbow_lakes Points 70013

Qui voulez-vous suggérer pour un nouveau projet?

Je dirais non plus! L'utilisation de Ressort de DAO JdbcTemplate avec StoredProcedure, RowMapper et RowCallbackHandler à 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, 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 ce avec mise en veille prolongée).

23voto

DataNucleus Points 12361

JDO est mort

JDO n'est pas mort en réalité alors s'il vous plaît vérifier vos faits. JDO 2.2 a été publié en octobre 2008 JDO 2.3 est en cours de développement.

Ceci est développé ouvertement, sous Apache. Plus de versions que JPA a eu, et sa spécification ORM est encore en avance même les fonctionnalités proposées JPA2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X