Gute Frage ohne einfache Antwort.
Ich war ein großer Fan von Hibernate, nachdem ich es über mehrere Jahre in mehreren Projekten verwendet hatte. Früher war ich der Meinung, dass jedes Projekt standardmäßig in den Ruhezustand versetzt werden sollte.
Heute bin ich mir nicht so sicher.
Hibernate (und JPA) eignen sich hervorragend für einige Dinge, insbesondere zu Beginn des Entwicklungszyklus. Es ist viel schneller, mit Hibernate zu arbeiten, als mit JDBC. Sie erhalten viele Funktionen zum kostenlosen Caching, zum optimistischen Sperren und so weiter.
Auf der anderen Seite hat es einige versteckte Kosten. Der Ruhezustand ist zu Beginn täuschend einfach . Befolgen Sie ein Tutorial, fügen Sie Ihrer Klasse einige Anmerkungen hinzu - und Sie haben Ausdauer. Aber es ist nicht einfach und um guten Code darin schreiben zu können, muss man sowohl die internen Abläufe als auch das Datenbankdesign gut verstehen. Wenn Sie gerade erst anfangen, sind Ihnen möglicherweise einige Probleme nicht bekannt, die Sie später beißen könnten. Hier ist eine unvollständige Liste.
Performance
Die Laufzeitleistung ist gut genug, ich habe noch keine Situation gesehen, in der der Ruhezustand der Grund für die schlechte Leistung in der Produktion war . Das Problem ist die Startleistung und wie sie sich auf die Zeit und die Entwicklungsleistung Ihrer Unit-Tests auswirkt. Wenn der Ruhezustand geladen wird, werden alle Entitäten analysiert und viele Vor-Caching-Vorgänge ausgeführt. Bei einer nicht sehr großen Anwendung kann dies etwa 5-10-15 Sekunden dauern. Ihr 1-Sekunden-Unit-Test dauert also jetzt 11 Sekunden. Kein Spaß.
Datenbankunabhängigkeit
Es ist sehr cool, solange Sie keine Feinabstimmung an der Datenbank vornehmen müssen.
In-Memory-Sitzung
Für jede Transaktion speichert Hibernate ein Objekt im Speicher für jede Datenbankzeile, die es "berührt". Es ist eine schöne Optimierung, wenn Sie eine einfache Dateneingabe vornehmen. Wenn Sie jedoch aus irgendeinem Grund viele Objekte verarbeiten müssen, kann dies die Leistung erheblich beeinträchtigen, es sei denn, Sie bereinigen die In-Memory-Sitzung explizit und sorgfältig selbst.
Kaskaden
Mit Kaskaden können Sie die Arbeit mit Objektdiagrammen vereinfachen. Wenn Sie beispielsweise ein Stammobjekt und einige untergeordnete Objekte haben und das Stammobjekt speichern, können Sie den Ruhezustand so konfigurieren, dass auch untergeordnete Objekte gespeichert werden. Das Problem beginnt, wenn Ihr Objektdiagramm komplexer wird. Wenn Sie nicht äußerst vorsichtig sind und ein gutes Verständnis dafür haben, was intern vor sich geht, ist es leicht, dies durcheinander zu bringen. Und wenn Sie dies tun, ist es sehr schwierig, diese Probleme zu beheben.
Faules Laden
Lazy Loading bedeutet, dass der Ruhezustand jedes Mal, wenn Sie ein Objekt laden, nicht alle zugehörigen Objekte lädt, sondern Platzhalter bereitstellt, die aufgelöst werden, sobald Sie versuchen, auf sie zuzugreifen. Tolle Optimierung, oder? Es ist so, außer dass Sie sich dieses Verhaltens bewusst sein müssen, sonst erhalten Sie kryptische Fehler. Google "LazyInitializationException" für ein Beispiel. Und seien Sie vorsichtig mit der Leistung. Abhängig von der Reihenfolge, in der Sie Ihre Objekte und Ihr Objektdiagramm laden, können Sie auf "n + 1 wählt Problem aus" klicken. Google es für weitere Informationen.
Schema-Upgrades
Der Ruhezustand ermöglicht einfache Schemaänderungen, indem nur Java-Code umgestaltet und neu gestartet wird. Es ist großartig, wenn Sie anfangen. Aber dann veröffentlichen Sie Version eins. Und wenn Sie Ihre Kunden nicht verlieren möchten, müssen Sie ihnen Schema-Upgrade-Skripte bereitstellen. Dies bedeutet kein einfacheres Refactoring mehr, da alle Schemaänderungen in SQL durchgeführt werden müssen.
Ansichten und gespeicherte Prozeduren
Für den Ruhezustand ist exklusiver Schreibzugriff auf die Daten erforderlich, mit denen er arbeitet. Dies bedeutet, dass Sie Ansichten, gespeicherte Prozeduren und Trigger nicht wirklich verwenden können, da diese Änderungen an Daten verursachen können, deren Ruhezustand sie nicht kennt. Einige externe Prozesse können Daten in separaten Transaktionen in die Datenbank schreiben. In diesem Fall enthält Ihr Cache jedoch ungültige Daten. Welches ist eine weitere Sache, um die man sich kümmern muss.
Single Threaded Sessions
Sitzungen im Ruhezustand sind Single-Threaded-Sitzungen. Auf jedes Objekt, das über eine Sitzung geladen wurde, kann nur von demselben Thread aus zugegriffen werden (einschließlich Lesen). Dies ist für serverseitige Anwendungen akzeptabel, kann jedoch unnötige Probleme verursachen, wenn Sie eine GUI-basierte Anwendung ausführen.
Ich denke mein Punkt ist, dass es keine kostenlosen Mahlzeiten gibt.
Der Ruhezustand ist ein gutes Werkzeug, aber es ist ein komplexes Werkzeug, und es erfordert Zeit, um es richtig zu verstehen. Wenn Sie oder Ihre Teammitglieder nicht über solche Kenntnisse verfügen, ist es möglicherweise einfacher und schneller, für eine einzelne Anwendung reines JDBC (oder Spring JDBC) zu verwenden. Wenn Sie jedoch bereit sind, Zeit in das Lernen zu investieren (einschließlich Learning by Doing und Debugging), können Sie die Kompromisse in Zukunft besser verstehen.