Mise en veille prolongée vs vs JDO JPA - avantages et les inconvénients de chacun? [fermé]

StackOverflow https://stackoverflow.com/questions/530215

Question

Je connais ORM en tant que concept, et je l'ai même il y a plusieurs années NHibernate utilisé pour un projet .NET; cependant, je ne l'ai pas suivi le sujet de ORM en Java et n'ont pas eu l'occasion d'utiliser ces outils.

Mais, maintenant, je peux avoir la chance de commencer à utiliser des outils ORM pour une de nos applications, pour tenter de passer d'une série de services Web existants.

Je vais avoir du mal à faire la différence betweeen la spécification JPA, ce que vous obtenez avec la bibliothèque Hibernate lui-même, et ce que JDO a à offrir.

Alors, je comprends que cette question est un peu ouvert, mais j'espérais obtenir des avis sur:

  • Quels sont les avantages et les inconvénients de chacun?
  • Qui proposeriez-vous pour un nouveau projet?
  • sont contre l'autre?
  • il certaines conditions quand il serait logique d'utiliser un cadre
Était-ce utile?

La solution

Quelques notes:

  • JDO et JPA sont les deux spécifications, pas implémentations.
  • L'idée est que vous pouvez échanger les implémentations JPA, si vous restreignez votre code pour utiliser uniquement la norme JPA. (Même chose pour JDO.)
  • Mise en veille prolongée peut être utilisé comme une telle mise en œuvre de l'APP.
  • Cependant, Hibernate fournit une API native, avec des caractéristiques ci-dessus et au-delà de celle de JPA.

OMI, je recommanderais Hibernate.


Il y a eu des commentaires / questions sur ce que vous devriez faire si vous besoin pour utiliser des fonctions spécifiques Hibernate. Il y a plusieurs façons de regarder, mais mon conseil serait:

  • Si vous n'êtes pas inquiet par la perspective d'encordement fournisseur, puis faites votre choix entre Hibernate, et d'autres implémentations JPA et JDO dont les différentes extensions spécifiques des fournisseurs dans votre prise de décision .

  • Si vous êtes inquiet par la perspective du fournisseur encordement et vous ne pouvez pas utiliser JPA sans avoir recours au fournisseur des extensions spécifiques, alors ne pas utiliser JPA. (Idem pour JDO).

En réalité, vous aurez probablement besoin de Compromis combien vous êtes inquiet par encordement fournisseur par rapport combien vous avez besoin ces fournisseurs 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ûtent en matière de licences, et dont l'histoire vous croyez au sujet de ce qui va se passer à l'avenir pour JDO et JPA.

Autres conseils

Assurez-vous que vous évaluez la mise en œuvre de DataNucleus de JDO. Nous avons commencé avec Hibernate parce qu'il semblait être si populaire mais très vite rendu compte que ce n'est pas une solution de persistance transparente à 100%. Il y a trop de mises en garde et la documentation est pleine de « si vous avez cette situation, alors vous devez écrire votre code comme celui-ci » qui a emporté le plaisir de la modélisation et le codage librement mais nous voulons. JDO a jamais me fit ajuster mon code ou mon modèle pour l'obtenir à « fonctionner correctement ». Je peux concevoir et code simple POJO comme si j'allais les utiliser « en mémoire » seulement, mais je peux les persister en toute transparence.

L'autre avantage de JDO / DataNucleus sur mise en veille prolongée est qu'il n'a pas tous les frais généraux de réflexion du temps de fonctionnement et est plus efficace de la mémoire, car il utilise le temps de construire l'amélioration du code octet (peut-être ajouter 1 sec à votre temps de construction pour un grand projet) plutôt que la réflexion de temps d'exécution de mise en veille prolongée motif de proxy alimenté.

Une autre chose que vous pourriez trouver ennuyeux avec Hibernate est une référence que vous avez à ce que vous pensez est l'objet ... il est souvent un « proxy » pour l'objet. Sans le bénéfice de l'amélioration du code octet le modèle proxy est nécessaire pour permettre le chargement de la demande (à savoir éviter de tirer dans l'ensemble de votre objet graphique lorsque vous tirez dans un objet de niveau supérieur). Préparez-vous à passer outre égaux et hashcode parce que l'objet 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 obtiendrez avec Hibernate que vous ne serez pas avec JDO:

http: //blog.andrewbeacock .com / 2008/08 / how-to-œuvre-hibernate-safe-equals.html
http://burtbeckwith.com/blog/?p=53

Si vous aimez le codage à « » des solutions de contournement puis, bien sûr, Hibernate est pour toi. Si vous appréciez propre, pur, orienté objet, le développement guidé par modèle où vous passez tout votre temps sur la modélisation, la conception et le codage et aucune des solutions de contournement sur laides passer ensuite quelques heures l'évaluation JDO / DataNucleus . Les heures investies seront remboursés mille fois.

Mise à jour février 2017

Pour un certain temps maintenant DataNucleus' met en œuvre la norme de persistance JPA, en plus de la norme de persistance JDO si le portage des projets existants de l'APP de Hibernate à DataNucleus devrait être très simple et vous pouvez obtenir tous mentionnés ci-dessus avantages de DataNucleus très peu de changement de code, le cas échéant. Donc, en termes de la question, le choix d'une norme particulière, JPA (SGBDR seulement) vs JDO (SGBDR + Non + SQL ODBMSes + autres), DataNucleus prend en charge, Hibernate est limitée à JPA uniquement.

Performance des mises à jour Hibernate DB

Une autre question à considérer lors du choix d'un ORM est l'efficacité de son mécanisme de vérification sale - qui devient très important quand il a besoin de construire le SQL pour mettre à jour les objets qui ont changé dans la transaction en cours - surtout quand il y a beaucoup de objets. Il y a une description technique détaillée du mécanisme de vérification sale de mise en veille prolongée dans cette réponse SO: JPA avec HIBERNATE insert très lent

J'ai récemment évalué et choisi un cadre de persistance pour un projet java et mes conclusions sont les suivantes:

Ce que je vois est que le soutien en faveur de JDO est principalement:

  • vous pouvez utiliser DataSources non-sql, db4o, HBase, ldap, BigTable, CouchDB (plugins pour cassandra) etc.
  • vous pouvez facilement passer d'un sql à datasource non sql et vice-versa.
  • aucun objet proxy et donc moins de douleur en ce qui concerne hashCode () et equals () implémentations
  • plus POJO et solutions de contournement par conséquent moins nécessaire
  • prend en charge plus les relations et types de champs

et le soutien en faveur de JPA est principalement:

  • plus populaire
  • JDO est mort
  • ne marche pas utiliser l'amélioration de bytecode

Je vois beaucoup de messages pro-JPA de développeurs JPA qui ont manifestement pas utilisés offrant JDO / DataNucleus arguments faibles pour ne pas utiliser JDO.

Je vois aussi beaucoup de messages des utilisateurs JDO qui ont émigré à JDO et sont beaucoup plus heureux en conséquence.

En ce qui concerne JPA étant plus populaire, il semble que cela est dû en partie à cause SGBDR le soutien des fournisseurs plutôt que ce soit techniquement supérieur. (On dirait VHS / Betamax pour moi).

JDO et il est la mise en œuvre de référence DataNucleus est clairement pas morte, comme le montre l'adoption de Google pour GAE et le développement actif sur le code source (http://sourceforge.net/projects/datanucleus/).

Je l'ai vu un certain nombre de plaintes concernant JDO en raison de l'amélioration de bytecode, mais pas d'explication encore pourquoi il est mauvais.

En fait, dans un monde qui devient de plus en plus obsédé par des solutions NoSQL, JDO (et la mise en œuvre de DataNucleus) semble un pari beaucoup plus sûr.

Je viens de commencer à utiliser JDO / DataNucleus et avoir mis en place afin que je puisse passer facilement à l'aide db4o et mysql. Il est utile pour le développement rapide d'utiliser db4o et ne pas avoir à se soucier trop sur le schéma de DB et puis, une fois le schéma est stabilisé pour se déployer dans une base de données. Je me sens aussi confiant que plus tard, je pouvais déployer tout / partie de ma demande à GAE ou profiter du stockage distribué / carte-réduire à la HBase / Hadoop / cassandra sans trop refactoring.

J'ai trouvé l'obstacle initial de commencer avec DataNucleus un peu délicat - La documentation sur le site Web de DataNucleus est un peu difficile d'entrer dans - les tutoriels ne sont pas aussi facilement à suivre comme je l'aurais aimé. Cela dit, la documentation plus détaillée sur l'API et la cartographie est très bonne une fois que vous avez passé la courbe d'apprentissage initiale.

La réponse est, cela dépend ce que vous voulez. Je préférerais avoir un code plus propre, sans fournisseur-lock-in, plus orienté POJO, les options NoSQL versets plus populaire.

Si vous voulez le sentiment pointilleux chaud que vous faites la même chose que la plupart des autres développeurs / moutons, choisissez JPA / mise en veille prolongée. Si vous voulez conduire dans votre domaine, essai routier JDO / DataNucleus et faire votre propre idée.

  

Ce qui proposeriez-vous pour un nouveau projet?

Je dirais non plus! Utilisez le JdbcTemplate de printemps avec DAO StoredProcedure, RowMapper et RowCallbackHandler à la place.

Mon expérience personnelle avec Hibernate est que le temps économisé à l'avant est plus que compensé par les interminables journées que vous passerez la ligne à essayer de comprendre et les problèmes de débogage comme un comportement inattendu de mise à jour en cascade.

Si vous utilisez un DB relationnelle alors le plus proche de votre code est, plus le contrôle que vous avez. La couche de DAO ressort permet un contrôle précis de la couche de cartographie, tout en éliminant la nécessité d'un code de passe-partout. En outre, il intègre dans la couche de transaction de printemps qui signifie que vous pouvez ajouter très facilement (via AOP) comportement transactionnel complexe sans cette intrusion dans votre code (bien sûr, vous obtenez ce Hibernate aussi).

  

JDO est mort

JDO n'est pas mort en fait donc 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.

est développée de manière ouverte, sous Apache. Plus de communiqués que JPA a eu, et sa spécification ORM est toujours en avant même les caractéristiques de JPA2 proposées

JDO est d'avoir des fonctionnalités avancées que JPA voir http://db.apache.org/jdo/ jdo_v_jpa.html

J'utilise JPA (mise en œuvre OpenJPA d'Apache qui est basé sur le code KODO JDO qui est 5+ ans et extrêmement rapide / fiable). À mon humble avis tous ceux qui vous dit de contourner les spécifications vous donne de mauvais conseils. Je mets le temps et a été définitivement récompensé. Avec soit JDO ou JPA, vous pouvez changer de fournisseur avec des changements minimes (JPA a la cartographie ORM nous parlons donc moins d'un jour pour changer éventuellement les fournisseurs). Si vous avez plus de 100 tables comme je le fais est énorme. De plus, vous obtenez built0in mise en cache avec les expulsions de cache-sage cluster et son tout bon. SQL / Jdbc est très bien pour les requêtes de haute performance, mais la persistance transparente est bien supérieure pour l'écriture de vos algorithmes et des routines d'entrée de données. Je n'ai environ 16 requêtes SQL dans mon système entier (50k + lignes de code).

Toute personne qui dit que JDO est mort est un fauteur de FUD astroturfing et ils le savent.

JDO est bel et bien vivant. Le cahier des charges est encore plus puissant, mature et avancé que le plus jeune et contraint JPA.

Si vous voulez vous limiter à ce qui est disponible uniquement dans la norme JPA, vous pouvez écrire à JPA et utiliser DataNucleus comme une haute performance, la mise en œuvre de la persistance plus transparent que les autres implémentations de JPA. Bien sûr DataNucleus met également en œuvre la norme JDO si vous voulez la flexibilité et l'efficacité de la modélisation qui apporte JDO.

Je l'ai cherché dans moi-même et ne peut pas trouver une forte différence entre les deux. Je pense que le grand choix dans lequel la mise en œuvre que vous utilisez. Pour moi, je l'ai considéré les DataNucleus plate-forme car il est une implémentation agnostique magasin de données à la fois.

Je l'ai utilisé Veille prolongée (implémentation JPA) et JPOX (mise en œuvre de JDO) dans le même projet. JPOX marchait bien, mais a couru dans des bugs assez rapidement, là où un langage Java 5 fonctionnalités qu'il n'a pas soutenu à l'époque. Il a eu des problèmes en jouant bien avec les transactions XA. Je suis la génération du schéma de base de données à partir des objets JDO. Il voulait se connecter à une base de données à chaque fois que ce qui est gênant si votre connexion Oracle se passe-t ne fonctionne pas.

Nous sommes passés à Hibernate alors. Nous avons joué autour avec juste en utilisant JPA pur pendant un certain temps, mais nous avions besoin d'utiliser quelques-unes des caractéristiques spécifiques à Hibernate pour faire la cartographie. Exécution du même code sur plusieurs bases de données est très facile. Mise en veille prolongée semble mettre en cache des objets de manière agressive ou tout simplement avoir un comportement étrange de la mise en cache parfois. Il y a quelques constructions Hibernate DDL ne peut pas gérer et ils sont définis dans un fichier supplémentaire qui est exécuté pour initialiser la base de données. Quand j'ai rencontré un problème Hibernate il y a souvent beaucoup de gens qui ont été exécutées dans le même problème qui rend googler des solutions plus faciles. Enfin, Hibernate semble être bien conçu et fiable.

D'autres intervenants ont suggéré que l'utilisation de SQL. Le vrai cas d'utilisation killer pour mapping objet relationnel est le test et le développement. Les bases de données qui sont conçus 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 bases de données Java en mémoire qui peuvent être utilisés pour tester avec, mais sont généralement inutiles pour la production. Etre capable d'utiliser une base de données réelle, mais limitée, augmentera la productivité du développement et la fiabilité du code.

J'ai fait un échantillon WebApp mai 2012 qui utilise JDO 3.0 et 3.0 DataNucleus - jetez un oeil comment nettoyer est: https://github.com/TorbenVesterager/BadAssWebApp

Ok peut-être il est un peu trop propre, parce que je les utilise POJO tant pour la base de données et le client JSON, mais il est amusant:)

PS: Contient quelques annotations de SuppressWarnings (développé dans IntelliJ 11)

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