Hibernate vs JPA vs JDO - Vor- und Nachteile von jedem? [geschlossen]

174

Ich bin mit ORM als Konzept vertraut und habe nHibernate vor einigen Jahren sogar für ein .NET-Projekt verwendet. Ich habe mich jedoch nicht mit dem Thema ORM in Java beschäftigt und hatte keine Gelegenheit, eines dieser Tools zu verwenden.

Aber jetzt habe ich möglicherweise die Möglichkeit, einige ORM-Tools für eine unserer Anwendungen zu verwenden, um mich von einer Reihe älterer Webdienste zu entfernen.

Es fällt mir schwer, den Unterschied zwischen der JPA-Spezifikation, dem, was Sie mit der Hibernate-Bibliothek selbst erhalten, und dem, was JDO zu bieten hat, zu erkennen.

Ich verstehe also, dass diese Frage etwas offen ist, aber ich hatte gehofft, einige Meinungen zu bekommen über:

  • Was sind die Vor- und Nachteile von jedem?
  • Welches würden Sie für ein neues Projekt vorschlagen?
  • Gibt es bestimmte Bedingungen, unter denen es sinnvoll wäre, ein Framework gegen das andere zu verwenden?
matt b
quelle

Antworten:

112

Einige Notizen:

  • JDO und JPA sind beide Spezifikationen, keine Implementierungen.
  • Die Idee ist, dass Sie JPA-Implementierungen austauschen können, wenn Sie Ihren Code auf die Verwendung von Standard-JPA beschränken. (Das Gleiche gilt für JDO.)
  • Der Ruhezustand kann als eine solche Implementierung von JPA verwendet werden.
  • Hibernate bietet jedoch eine native API mit Funktionen, die über die von JPA hinausgehen.

IMO würde ich Hibernate empfehlen.


Es gibt einige Kommentare gewesen / Fragen über das, was Sie tun sollen , wenn Sie benötigen Hibernate-spezifische Funktionen verwenden. Es gibt viele Möglichkeiten, dies zu betrachten, aber mein Rat wäre:

  • Wenn Sie sich keine Sorgen über die Aussicht auf eine Lieferantenbindung machen, treffen Sie Ihre Wahl zwischen Hibernate und anderen JPA- und JDO-Implementierungen, einschließlich der verschiedenen herstellerspezifischen Erweiterungen bei Ihrer Entscheidungsfindung.

  • Wenn Sie sich Sorgen über die Aussicht auf eine Lieferantenbindung machen und JPA nicht verwenden können, ohne auf herstellerspezifische Erweiterungen zurückzugreifen, verwenden Sie JPA nicht. (Das Gleiche gilt für JDO).

In der Realität müssen Sie wahrscheinlich abwägen, wie sehr Sie sich über die Lieferantenbindung Sorgen machen und wie sehr Sie diese herstellerspezifischen Erweiterungen benötigen.

Und es gibt noch andere Faktoren, wie zum Beispiel, wie gut Sie / Ihre Mitarbeiter die jeweiligen Technologien kennen, wie viel die Produkte bei der Lizenzierung kosten und wessen Geschichte Sie glauben, was in Zukunft für JDO und JPA passieren wird.

Toolkit
quelle
8
Toolkit, schön und kurz. Ein weiterer erwähnenswerter Punkt ist, dass JPA nicht verhindert, dass bei Bedarf implementierungsspezifische Funktionen verwendet werden. Das bedeutet, dass Sie mit JPA jede Hibernate-Funktion verwenden können, wenn Hibernate eine Implementierung ist.
Topchef
1
Was wären die Vorteile der Verwendung von JPA, wenn ich eine bestimmte Funktion von Hibernate benötige?
Bruno Reis
22
Ein wichtiger Hinweis, der hinzugefügt werden sollte: Während JPA und JDO beide RDBMS hervorragend unterstützen, ist JDO "Datenspeicher" -unabhängig und daher nicht auf die RDBMS-Welt beschränkt. Angesichts des derzeitigen Aufschwungs von NoSQL wäre es für eine Person ratsam, einen Persistenzstandard zu verwenden, der es vermeidet, ihre Apps an die traditionelle * SQL-Welt zu binden. JDO-Anwendungen können problemlos ohne RDBMS-Datenspeicher bereitgestellt werden. Die vollständige Liste der unterstützten Datenspeicher finden Sie unter: datanucleus.org/products/accessplatform/datastores.html
Volksman
2
@Golfman warum wählen, basierend auf dem, was passieren könnte ? Nichts hindert Sie daran, später etwas anderes zu tun, wenn Sie jemals NoSQL-Unterstützung benötigen ... KISS
TM.
1
@Bruno - wenn Sie verwenden nicht-Hibernate spezifische Teile von Hibernate, Sie sind mit JPA. Der Vorteil der Beschränkung auf reine JPA besteht natürlich darin, dass Sie einfacher zu einer anderen JPA-Implementierung wechseln können.
Stephen C
69

Stellen Sie sicher, dass Sie die DataNucleus-Implementierung von JDO evaluieren. Wir haben mit Hibernate angefangen, weil es so beliebt zu sein schien, aber ziemlich bald wurde uns klar, dass es sich nicht um eine 100% transparente Persistenzlösung handelt. Es gibt zu viele Vorbehalte und die Dokumentation ist voll von "Wenn Sie diese Situation haben, müssen Sie Ihren Code so schreiben", die den Spaß am freien Modellieren und Codieren nach Belieben genommen hat. JDO hat mich nie veranlasst, meinen Code oder mein Modell anzupassen, damit es ordnungsgemäß funktioniert. Ich kann einfache POJOs einfach so entwerfen und codieren, als würde ich sie nur "im Speicher" verwenden, aber ich kann sie transparent beibehalten.

Der andere Vorteil von JDO / DataNucleus gegenüber dem Ruhezustand besteht darin, dass es nicht den gesamten Aufwand für die Laufzeitreflexion hat und speichereffizienter ist, da die Verbesserung des Build-Time-Byte-Codes verwendet wird (möglicherweise wird Ihre Build-Zeit für ein großes Projekt um 1 Sekunde verlängert) als das zur Laufzeitreflexion angetriebene Proxy-Muster des Ruhezustands.

Eine andere Sache, die Sie im Ruhezustand möglicherweise stören, ist, dass ein Verweis auf das, was Sie denken, das Objekt ist ... es ist oft ein "Proxy" für das Objekt. Ohne den Vorteil der Bytecode-Verbesserung ist das Proxy-Muster erforderlich, um das Laden bei Bedarf zu ermöglichen (dh vermeiden Sie das Ziehen Ihres gesamten Objektdiagramms, wenn Sie ein Objekt der obersten Ebene ziehen). Seien Sie darauf vorbereitet, Gleichheits- und Hashcode zu überschreiben, da das Objekt, auf das Sie sich beziehen, häufig nur ein Proxy für dieses Objekt ist.

Hier ist ein Beispiel für Frustrationen, die Sie mit Hibernate bekommen, die Sie mit JDO nicht bekommen werden:

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

Wenn Sie gerne zu Problemumgehungen codieren, ist Hibernate genau das Richtige für Sie. Wenn Sie eine saubere, reine, objektorientierte, modellgetriebene Entwicklung schätzen, bei der Sie Ihre ganze Zeit mit Modellieren, Entwerfen und Codieren verbringen und nichts davon mit hässlichen Problemumgehungen, dann verbringen Sie einige Stunden mit der Evaluierung von JDO / DataNucleus . Die investierten Stunden werden tausendfach zurückgezahlt.

Update Februar 2017

Seit geraumer Zeit implementiert DataNucleus zusätzlich zum JDO-Persistenzstandard den JPA-Persistenzstandard. Daher sollte die Portierung vorhandener JPA-Projekte von Hibernate nach DataNucleus sehr einfach sein und Sie können alle oben genannten Vorteile von DataNucleus mit sehr geringen Codeänderungen nutzen , wenn überhaupt. In Bezug auf die Frage, die Auswahl eines bestimmten Standards, JPA (nur RDBMS) gegenüber JDO (RDBMS + kein SQL + ODBMS + andere), unterstützt DataNucleus beide, Hibernate ist nur auf JPA beschränkt.

Leistung von Hibernate DB-Updates

Ein weiteres Problem, das bei der Auswahl eines ORM berücksichtigt werden muss, ist die Effizienz seines Dirty-Checking-Mechanismus. Dies ist sehr wichtig, wenn SQL erstellt werden muss, um die Objekte zu aktualisieren, die sich in der aktuellen Transaktion geändert haben - insbesondere, wenn viele Objekte vorhanden sind. In dieser SO-Antwort finden Sie eine detaillierte technische Beschreibung des schmutzigen Überprüfungsmechanismus von Hibernate: JPA mit sehr langsamer HIBERNATE-Einfügung

Volksman
quelle
3
Und wie wir alle wissen, ist die Verbesserung genau der Grund, warum JDO so massiv übernommen wurde!
Pascal Thivent
15
Die gut bekannt gemachte FUD und das Astroturfing, die in den frühen Tagen von wichtigen Hibernate-Spielern in Bezug auf JDO durchgeführt wurden, sind geradezu unehrlich und widerlich und hatten zweifellos einen gewissen Einfluss auf die Einführung von JDO. Heutzutage wissen Entwickler, dass die Verbesserung des Bytecodes überhaupt kein Problem darstellt, und verwenden sie häufig für viele andere Zwecke als die Persistenz. Die neue ASM-Bytecode-Erweiterungsbibliothek ist so blitzschnell, dass Sie nicht einmal Zeit haben, Luft zu holen, bevor sie fertig ist.
Volksman
7
Der Ausfall von JDO wurde seit dem Start ( javalobby.org/forums/thread.jspa?forumID=46&threadID=1326 ) und vor dem Ruhezustand vorhergesagt, sodass Sie Hibernate nicht dafür verantwortlich machen können. Hibernate / Toplink war dort erfolgreich, wo Sun- und JDO-Spieler (und ihre OODBMS) versagten, weil sie zu dieser Zeit bessere Antworten waren, nicht wegen Marketing und FUD. Zeitraum. Wer kümmert sich , wenn ASM ist schnell prallen heute , es wurde vor nicht dort 5 Jahre, bei Bedarf und JDO einfach die Schlacht verloren. JDO ist konzeptionell überlegen? Schade, dass es nicht gelungen ist, eine Gewinnerimplementierung rechtzeitig zu erhalten (und aufgrund von JPA nicht zurückkommt).
Pascal Thivent
2
Um meine Worte zu veranschaulichen (ein weiterer Beitrag, der den Schmerz veranschaulicht, den die Menschen während der Entwicklung empfanden oder warum Hibernate den Kampf gewonnen hat): mail-archive.com/[email protected]/… . Es scheint mir offensichtlich, dass Reflection / Cglib eine praktische Antwort auf die Probleme der Leute war (und es ist den Leuten egal, ob eine API konzeptionell überlegen ist, wenn es schwierig ist, sie zu verwenden), und ich sehe hier keine Hauptakteure im Ruhezustand, nur Benutzer . Also am Ende frage ich mich, wer FUD tatsächlich verbreitet ...
Pascal Thivent
7
Nun, das ist sicherlich nicht wie früher, als es mindestens 17 verschiedene Pro Hibernate FUD-Posts gegeben hätte (aber nur von 3 verschiedenen IP-Adressen. Do the maths people =)).
Volksman
54

Ich habe kürzlich ein Persistenz-Framework für ein Java-Projekt evaluiert und ausgewählt. Meine Ergebnisse lauten wie folgt:

Was ich sehe ist, dass die Unterstützung für JDO in erster Linie ist:

  • Sie können Nicht-SQL-Datenquellen, db4o, hbase, ldap, bigtable, couchdb (Plugins für Cassandra) usw. verwenden.
  • Sie können problemlos von einer SQL- zu einer Nicht-SQL-Datenquelle und umgekehrt wechseln.
  • Keine Proxy-Objekte und daher weniger Schmerzen in Bezug auf Hashcode () - und Equals () - Implementierungen
  • Mehr POJO und damit weniger Problemumgehungen erforderlich
  • unterstützt mehr Beziehungs- und Feldtypen

und die Unterstützung zugunsten von JPA ist in erster Linie:

  • bekannter
  • jdo ist tot
  • verwendet keine Bytecode-Verbesserung

Ich sehe viele Pro-JPA-Posts von JPA-Entwicklern, die JDO / Datanucleus eindeutig nicht verwendet haben und schwache Argumente dafür liefern, JDO nicht zu verwenden.

Ich sehe auch viele Beiträge von JDO-Benutzern, die auf JDO migriert sind und daher viel glücklicher sind.

In Bezug auf die Popularität von JPA scheint dies teilweise auf die Unterstützung von RDBMS-Anbietern zurückzuführen zu sein, anstatt technisch überlegen zu sein. (Klingt für mich nach VHS / Betamax).

JDO und seine Referenzimplementierung Datanucleus ist eindeutig nicht tot, wie die Übernahme durch Google für GAE und die aktive Entwicklung des Quellcodes (http://sourceforge.net/projects/datanucleus/) zeigt.

Ich habe eine Reihe von Beschwerden über JDO aufgrund der Bytecode-Verbesserung gesehen, aber noch keine Erklärung dafür, warum es schlecht ist.

In einer Welt, die immer mehr von NoSQL-Lösungen besessen ist, scheint JDO (und die Implementierung des Datenkerns) eine viel sicherere Wahl zu sein.

Ich habe gerade angefangen, JDO / Datanucleus zu verwenden, und habe es so eingerichtet, dass ich problemlos zwischen der Verwendung von db4o und mysql wechseln kann. Für eine schnelle Entwicklung ist es hilfreich, db4o zu verwenden und sich nicht zu viele Gedanken über das DB-Schema zu machen. Sobald das Schema stabilisiert ist, kann es in einer Datenbank bereitgestellt werden. Ich bin auch zuversichtlich, dass ich später meine gesamte / einen Teil meiner Anwendung für GAE bereitstellen oder verteilten Speicher nutzen / Karten reduzieren / a hbase / hadoop / cassandra reduzieren kann, ohne zu viel Refactoring.

Ich fand die anfängliche Hürde beim Einstieg in Datanucleus etwas schwierig - Die Dokumentation auf der Datanucleus-Website ist etwas schwierig - die Tutorials sind nicht so einfach zu befolgen, wie ich es mir gewünscht hätte. Trotzdem ist die detailliertere Dokumentation der API und des Mappings sehr gut, sobald Sie die anfängliche Lernkurve überwunden haben.

Die Antwort ist, es kommt darauf an, was Sie wollen. Ich hätte lieber saubereren Code, No-Vendor-Lock-In, Pojo-orientierter, nosql-Optionen versus populärere.

Wenn Sie das warme, pingelige Gefühl haben möchten, dass Sie das Gleiche tun wie die meisten anderen Entwickler / Schafe, wählen Sie JPA / Ruhezustand. Wenn Sie auf Ihrem Gebiet führend sein möchten, testen Sie JDO / Datanucleus und entscheiden Sie sich selbst.

Tom
quelle
9
Wie ich bereits sagte, gab ich nur meine Eindrücke von dem, was ich entdeckt hatte, als ich versuchte, eine Lösung zu finden. Ja, ich bin ein Anfänger in Java, warum sollte das so relavent sein? Auf der anderen Seite haben Sie mehrmals Ihre Meinung zum Tod von JDO veröffentlicht, ohne Fakten oder Beweise dafür vorzulegen und die technischen Bereiche nicht anzuerkennen, in denen JDO eindeutig überlegen ist. Sie haben offensichtlich etwas Persönliches gegen JDO / Datanucleus und verwenden diese Threads als Mittel, um Ihre Anti-JDO-Haltung aufrechtzuerhalten.
Tom
4
Pascal - Sie streiten sich hier in eine Ecke. Ich denke, Sie verpassen den Punkt des Werbeabschnitts der FAQ. Das OP bat um Meinungen zu zwei Technologien. Sie fordert diejenigen, die beide Seiten unterstützen, auf, sich zu äußern und ihre konstruktiven Kritikpunkte / Empfehlungen vorzulegen. Für Andy / Datanucleus und andere JDO-Benutzer ist es nicht mehr Werbung, JDO-Positive hervorzuheben und sich gegen Kritik zu verteidigen, als jemand anderes, der hier die Verwendung des Ruhezustands empfiehlt.
Tom
5
Sie können sich gut auf den Abschnitt der FAQ beziehen, in dem "Sei nett" steht, denn Ihre Beiträge zu diesem Thema waren anklagend, konfrontativ oder einfach unhöflich. Ihr erster war ein sarkastischer Kommentar zur Verbesserung. Zweite; ein Scherz über die Schwierigkeiten der frühen Implementierung und ist nicht mehr relevant. Drittens war eine kindische Verspottung und Beleidigung für diejenigen, die es vorziehen könnten, RDBMS nicht zu verwenden. Viertens war sarkastische Verspottung von jemandem, der andere Ansichten zu Ihnen hat. Fünftens war ein Angriff; Nenn mich einen Papagei. Betrachten Sie das als "nett sein"?
Tom
3
Wenn Sie eine schreckliche Erfahrung mit JDO gemacht haben, erklären Sie, was schrecklich war, und bestätigen Sie, dass es sich um eine frühere Version handelt und die Dinge seitdem möglicherweise verbessert wurden. Sie müssen auch erkennen, dass andere möglicherweise andere Bedürfnisse haben als Sie. Nur weil Sie mit JPA „zufrieden“ sind und ein RDBMS verwenden möchten, heißt das nicht, dass dies andere tun. Vielleicht haben Sie in Ihrer Eile, Ihren Ruf zu verbessern, aus den Augen verloren, was dieser Ruf zu vergeben hat? ps. Als Entwickler sollten Sie sich wirklich für das Wohlergehen solcher Projekte interessieren, da dies die Innovation vorantreibt und die Lieferantenbindung verringert.
Tom
6
Dies wird meine endgültige Antwort sein :) .. 1. Wenn es nicht relavent war zu fragen, warum es erhöhen? 2. Ich habe Ihre Ehrlichkeit nie in Frage gestellt. Ich sagte, Sie seien nicht nett zu anderen Postern und Sie widersprachen sich. 3. Niemand hat vorgeschlagen, mehr als 8 Jahre zusammenzufassen - aber Ihre Aussagen mit Fakten und Beispielen zu untermauern, anstatt mit subjektiven Aussagen, die wahrscheinlich beleidigen. 5. Wo ist die Einstellung "Ruhezustand / jpa / jboss ist böse" in diesem Beitrag? Ich sehe es nicht. Ich sehe nur Ihre Anti-JDO-Kommentare.
Tom
40

Welches würden Sie für ein neues Projekt vorschlagen?

Ich würde weder vorschlagen! Verwenden Frühling DAO ist JdbcTemplatezusammen mit StoredProcedure, RowMapperund RowCallbackHandlerstattdessen.

Meine persönliche Erfahrung mit Hibernate ist, dass die im Voraus eingesparte Zeit durch die endlosen Tage, die Sie später damit verbringen werden, Probleme wie unerwartetes kaskadierendes Update-Verhalten zu verstehen und zu debuggen, mehr als ausgeglichen wird.

Wenn Sie eine relationale Datenbank verwenden, haben Sie umso mehr Kontrolle, je näher Ihr Code daran ist. Die DAO-Schicht von Spring ermöglicht die Feinsteuerung der Mapping-Schicht, ohne dass Boilerplate-Code erforderlich ist. Außerdem ist es in die Transaktionsschicht von Spring integriert, was bedeutet, dass Sie sehr einfach (über AOP) kompliziertes Transaktionsverhalten hinzufügen können, ohne dass dies in Ihren Code eindringt (natürlich erhalten Sie dies auch mit Hibernate).

oxbow_lakes
quelle
4
Dies ist eindeutig eine ORM-Wahl (Anti-Object-Relational Mapping), die von einer großen Benutzer- und Codebasis bestimmt wird, die seit ODBC-Zeiten (Anfang der 90er Jahre) angesammelt wurde (Read Legacy). Es gibt keinen Grund, JDBC (mit oder ohne Spring) nicht zu verwenden, es sei denn, Sie möchten das ORM-Framework verwenden. Denken Sie an die Leute, die eines Tages beschlossen haben, FORTRAN loszuwerden, um C oder Pascal zu verwenden.
Topchef
23
@grigory - Ich spreche mit viel Erfahrung darin, Tage damit zu verschwenden, Probleme im Ruhezustand zu verstehen, wie z. B. kaskadierende Aktualisierungen / Löschungen, lächerlich ineffiziente Abfragestrukturen usw. ORM-Lösungen sind ein "schneller Gewinn" für diejenigen, die nicht über ausreichende Kenntnisse relationaler Datenbanken verfügen. Daher ist es unwahrscheinlich, dass die Kenntnis des Ruhezustands allein zu einem guten Endprodukt führt. Ich habe die Erfahrung gemacht, dass Hibernate (und ORM im weiteren Verlauf) im Laufe des Projektlebenszyklus mehr Zeit kosten als es spart
oxbow_lakes
8
Es tut mir leid, dass Sie so schlechte Erfahrungen mit Hibernate gemacht haben. Ich komme selbst aus einer schweren Datenbank / SQL / gespeicherten Prozedur / JDBC-Schule. Ich kann nicht sagen, dass ich konvertiert bin - jede Technologie oben hat noch einen Platz zu sein. Für allgemeine Java 3-Tier-Anwendungen (unabhängig von der Größe) ist die erste Wahl eine ORM-Technologie - vorzugsweise JPA 2. Andere sind auf der Grundlage solcher Faktoren zu berücksichtigen: Legacy-Code, Integration, Fachwissen, stapelintensive Anforderungen, Echtzeit Leistung usw., die den Ansatz in Richtung eines anderen Datenbanktechnologie-Stacks steuern (oder auch nicht).
Topchef
3
Ich bin mit der obigen Definition von "Quick-Win" überhaupt nicht einverstanden - greifen Sie einfach zu Hibernate in Action ( stackoverflow.com/questions/96729/… ) (und es ist JPA 1, mit JPA 2 wird es nur besser), um die Leistung und Abdeckung dieser Technologie vollständig zu verstehen hat.
Topchef
7
Ich habe ein wenig recherchiert und Spring empfiehlt Spring DAOs ( static.springsource.org/spring/docs/3.0.x/… ) nicht mehr : "Der empfohlene Integrationsstil besteht darin, DAOs gegen einfache Hibernate-, JPA- und JDO-APIs zu codieren Ein älterer Stil zur Verwendung der DAO-Vorlagen von Spring wird nicht mehr empfohlen. "... Haben Sie dies empfohlen? Wenn ja, warum empfehlen sie es nicht?
User1
23

JDO ist tot

JDO ist eigentlich nicht tot. Bitte überprüfen Sie Ihre Fakten. JDO 2.2 wurde im Oktober 2008 veröffentlicht. JDO 2.3 befindet sich in der Entwicklung.

Dies wird offen unter Apache entwickelt. Es gibt mehr Releases als JPA, und die ORM-Spezifikation ist noch vor den von JPA2 vorgeschlagenen Funktionen

DataNucleus
quelle
12
Die Leute verwenden es mit Sicherheit, wie die vielen Benutzer von DataNucleus belegen, ganz zu schweigen von Xcalia und Kodo. Sie vermissen die Grundidee, dass JDO und JPA nicht denselben Markt füllen. JPA ist ausschließlich RDBMS. JDO ist datenspeicherunabhängig und wird für RDBMS, aber auch für LDAP, XML, Excel, OODBMs usw. verwendet
DataNucleus
3
Ich mag den Nicht-RDBMS-Faktor, insbesondere angesichts der zunehmenden Beliebtheit von Nicht-RDBMS-Lösungen, es ist eine große Sache. Dies bedeutet, dass, wenn sich JPA nicht schnell genug entwickelt, die Verfügbarkeit einer "offeneren" und flexibleren Alternative (JDO) bedeutet, dass die Popularität von JPA notgedrungen nach unten tendiert. Ungeachtet der technischen Argumente, dass JDO vollständiger, überlegener, ausgereifter oder was auch immer ist - es wird keine Frage der Präferenz sein . Es ist sinnvoll, dass sich RDBMS-Anbieter misstrauisch verhalten - die Tage der RDBMS-Marktbeherrschung könnten zu Ende gehen.
Manius
Wir verwenden noch 2019 JDO / DataNucleus! Es ist jetzt bis Version 5.x und übertrifft Hibernate hinsichtlich Entwicklerproduktivität und Laufzeitleistung. Vor kurzem musste ich mich mit Hibernate über eine große Web-App beraten lassen und wurde an die Schmerzen erinnert, die ich hatte, als ich vor vielen Jahren ein aktiver HIbernate-Benutzer und Promoter war. Ein Teamleiter glaubte mir nicht, als ich ihr sagte, dass ihr BLOB-Feld wurde immer eifrig geholt, obwohl es als faul geholt markiert war. Der völlige Mangel an "unter der Haube" -Wissen eines "erfahrenen" selbsternannten Hibernate-Experten war leider beunruhigend, wurde aber erwartet.
Volksman
15

JDO verfügt über erweiterte Funktionen als JPA (siehe http://db.apache.org/jdo/jdo_v_jpa.html)

Sandeep Manne
quelle
Sehr richtig! Aber niemand scheint es zu wissen ...
marcolopes
10

Ich verwende JPA (OpenJPA-Implementierung von Apache, die auf der KODO JDO-Codebasis basiert, die mindestens 5 Jahre alt und extrem schnell / zuverlässig ist). IMHO gibt Ihnen jeder, der Ihnen sagt, dass Sie die Spezifikationen umgehen sollen, schlechte Ratschläge. Ich habe mir die Zeit genommen und wurde definitiv belohnt. Mit JDO oder JPA können Sie den Anbieter mit minimalen Änderungen wechseln (JPA verfügt über eine Orm-Zuordnung, sodass wir weniger als einen Tag sprechen, um möglicherweise den Anbieter zu wechseln). Wenn Sie mehr als 100 Tische haben, wie ich, ist das riesig. Außerdem erhalten Sie ein integriertes Caching mit clusterweisen Cache-Räumungen, und alles ist gut. SQL / Jdbc eignet sich gut für Hochleistungsabfragen, aber die transparente Persistenz ist beim Schreiben Ihrer Algorithmen und Dateneingaberoutinen weit überlegen. Ich habe nur ungefähr 16 SQL-Abfragen in meinem gesamten System (mehr als 50.000 Codezeilen).


quelle
8

Ich habe mich selbst damit befasst und kann keinen starken Unterschied zwischen den beiden feststellen. Ich denke, die große Wahl ist, welche Implementierung Sie verwenden. Für mich selbst habe ich die DataNucleus- Plattform in Betracht gezogen , da es sich um eine datenspeicherunabhängige Implementierung von beiden handelt.

Tapi
quelle
6
+1 für DataNucleus, nicht für die Antwort.
WolfmanDragon
8

Jeder, der sagt, dass JDO tot ist, ist ein Astroturfing-FUD-Händler und sie wissen es.

JDO lebt und es geht ihm gut. Die Spezifikation ist immer noch leistungsfähiger, ausgereifter und fortgeschrittener als die viel jüngere und eingeschränkte JPA.

Wenn Sie sich nur auf das beschränken möchten, was im JPA-Standard verfügbar ist, können Sie in JPA schreiben und DataNucleus als leistungsstarke, transparentere Persistenzimplementierung verwenden als die anderen Implementierungen von JPA. Natürlich implementiert DataNucleus auch den JDO-Standard, wenn Sie die Flexibilität und Effizienz der Modellierung wünschen, die JDO bietet.

Volksman
quelle
1
Oder Sie verwenden eine andere (feine) Implementierung mit einer viel größeren und folglich reaktionsschnelleren Community. Ja, einige Leute kümmern sich auch darum.
Pascal Thivent
1
Und du redest über FUD> :) Witzig.
Pascal Thivent
2
Ihr Kommentar scheint davon auszugehen, dass ich nicht sowohl Hibernate als auch JDO verwendet habe.
Volksman
2
Dieser Thread scheint eine Menge Referenzen von ein paar Leuten zu haben, wie großartig DataNucleus ist. Bitte nutzen Sie diesen Ort nicht als Werbeplattform.
TM.
3
Kein Wunder von Golfman, der in jedem Thread mit JPA oder DataNucleus (den er seit 1996 verwendet , bevor es ihn überhaupt gab !) Immer wieder das gleiche verzweifelte Marketingmaterial einfügt .
Pascal Thivent
2

Ich habe Hibernate (JPA-Implementierung) und JPOX (JDO-Implementierung) im selben Projekt verwendet. JPOX funktionierte einwandfrei, stieß jedoch ziemlich schnell auf Fehler, da einige Java 5-Sprachfunktionen zu diesem Zeitpunkt nicht unterstützt wurden. Es hatte Probleme, mit XA-Transaktionen gut zu spielen. Ich habe das Datenbankschema aus den JDO-Objekten generiert. Es wollte jedes Mal eine Verbindung zu einer Datenbank herstellen, was ärgerlich ist, wenn Ihre Oracle-Verbindung nicht funktioniert.

Wir sind dann in den Ruhezustand gewechselt. Wir haben eine Weile damit gespielt, nur reines JPA zu verwenden, aber wir mussten einige der Hibernate-spezifischen Funktionen verwenden, um das Mapping durchzuführen. Das Ausführen des gleichen Codes in mehreren Datenbanken ist sehr einfach. Der Ruhezustand scheint Objekte aggressiv zwischenzuspeichern oder hat manchmal nur ein seltsames Caching-Verhalten. Es gibt einige DDL-Konstrukte, die Hibernate nicht verarbeiten kann. Sie werden daher in einer zusätzlichen Datei definiert, die zum Initialisieren der Datenbank ausgeführt wird. Wenn ich auf ein Problem im Ruhezustand gestoßen bin, sind oft viele Menschen auf dasselbe Problem gestoßen, was das Googeln nach Lösungen erleichtert. Schließlich scheint Hibernate gut gestaltet und zuverlässig zu sein.

Einige andere Antwortende haben vorgeschlagen, nur SQL zu verwenden. Der wahre Killer-Anwendungsfall für die objektrelationale Zuordnung ist das Testen und Entwickeln. Die Datenbanken, die für die Verarbeitung großer Datenmengen erstellt wurden, sind in der Regel teuer und schwer zu installieren. Sie sind schwer zu testen. Es gibt viele speicherinterne Java-Datenbanken, mit denen getestet werden kann, die jedoch für die Produktion normalerweise unbrauchbar sind. Die Verwendung einer realen, aber begrenzten Datenbank erhöht die Entwicklungsproduktivität und die Codezuverlässigkeit.

Sean McCauliff
quelle
1
Soweit ich das beurteilen kann, hat JPOX den Namen in DataNucleus geändert (und seitdem veröffentlicht).
Donal Fellows
2
Denken Sie, Sie werden tatsächlich feststellen, dass DataNucleus weit weniger offene Fehler aufweist als die andere Software, auf die Sie sich beziehen. Denken Sie, Sie werden auch feststellen, dass die DataNucleus-Entwicklung die Anzahl der Fehler schneller reduziert als die andere Software.
DataNucleus
1

Ich habe im Mai 2012 eine Beispiel-WebApp erstellt, die JDO 3.0 und DataNucleus 3.0 verwendet. Sehen Sie sich an, wie sauber sie ist: https://github.com/TorbenVesterager/BadAssWebApp

Okay, vielleicht ist es ein bisschen zu sauber, weil ich die POJOs sowohl für die Datenbank als auch für den JSON-Client verwende, aber es macht Spaß :)

PS: Enthält einige SuppressWarnings-Anmerkungen (entwickelt in IntelliJ 11).

Torben Vesterager
quelle