1.1 Zuordnung von Klassen zu Tabellen

Nachdem Sie JDBC erlernt haben, haben Sie höchstwahrscheinlich den Eindruck, dass die Arbeit mit einer Datenbank aus einer Java-Anwendung heraus immer noch ein Vergnügen ist. Was wäre, wenn ich Ihnen sagen würde, dass diese ganze Arbeit zehnmal einfacher erledigt werden könnte?

Was ist der Hauptvorteil der SQL-Sprache? Dies ist eine deklarative Sprache – sie beschreibt, was wir bekommen wollen, und sagt überhaupt nichts darüber aus, wie wir es erreichen sollen. Wie – das ist die Sorge des SQL-Servers.

Der gleiche Ansatz kann bei der Arbeit mit Datenbanken verwendet werden.

In einer idealen Welt könnten wir einfach SQL-Abfragen in die Datenbank schreiben und als Antwort würden wir fertige Java-Objekte oder Sammlungen von Java-Objekten erhalten, wenn wir mehrere davon anfordern würden.

Was soll ich sagen, das dachten sich im Jahr 2000 mehrere Leute und beschlossen, ihr eigenes ORM-Framework zu schreiben.

ORM steht für Object-Relational Mapping und ist im Wesentlichen eine Zuordnung von Java-Objekten zu SQL-Abfragen.

Die Jungs haben sich etwas ganz Einfaches ausgedacht: Jede Tabelle in der Datenbank muss einer Klasse in der Java-Anwendung entsprechen . In einer Java-Anwendung arbeiten wir mit Objekten, und diese Objekte wissen bereits, wie sie sich in der Datenbank speichern.

Zur Lösung dieses Problems gab es drei Ansätze, die etwa so aussahen:

  1. Das Objekt speichert sich selbst in der Datenbank und aktualisiert seine Felder basierend auf Informationen aus der Datenbank.
  2. Das Objekt kann sich in der Datenbank speichern, löst diesen Fall jedoch nie aus.
  3. Das Objekt enthält nur Daten, und jemand speichert es in der Datenbank und lädt es aus der Datenbank.

Zunächst dominierte der erste Ansatz, dann waren Anwendungsserver und Enterprise Java Beans beliebt. Es gab sogar eine ganze Klasse von Beans namens Persistence EJBs, die sich selbst in der Datenbank speichern konnten.

Doch eines Tages änderte sich alles ...

1.2 Entstehung des Winterschlafs

Im Jahr 2001 wurde die erste Version des Hibernate-Frameworks veröffentlicht. Es war ein sehr einfaches Framework, aber es ermöglichte die Verwendung gewöhnlicher „dummer Objekte“, die nichts darüber wussten, wie sie in der Datenbank gespeichert oder von dort geladen werden sollten.

Die Zuordnung von Feldern von Java-Klassen und Spalten in einer Tabelle in der Datenbank wurde mithilfe einer XML-Datei festgelegt. Und manchmal waren sie ziemlich sperrig. Okay, wem mache ich Witze? Es handelte sich um riesige Leinwände mit XML-Code. Und die Situation wurde nur dadurch gerettet, dass es vor 20 Jahren noch keine so riesigen Datenbanken gab wie heute.

Tatsächlich bestand die wirkungsvollste Entscheidung jedoch darin, das Objekt, das in der Datenbank gespeichert werden muss, endgültig von dem Code zu trennen, der es dort gespeichert hat . Diese Lösung ist nicht wirklich offensichtlich. Denn das Prinzip der Kapselung besagt, dass das Objekt am besten weiß, wie es gespeichert und geladen werden muss.

Und der ORM-Ansatz durchbricht dieses Konzept wirklich. Die Datenklasse legt ihre interne Struktur offen, es ist jedoch viel einfacher geworden, mit Gruppen von Objekten unterschiedlichen Typs zu arbeiten.

Ein großer Durchbruch kam nach der Veröffentlichung von Java 5 , als zwei Dinge im JDK auftauchten:

  • Anmerkungen
  • Proxy

AnmerkungenXML wurde schnell verdrängt und nun war es einfach, alle notwendigen Einstellungen für die Zuordnung einer Java-Klasse zu einer Tabelle in der Datenbank direkt in der Java-Klasse festzulegen.

StellvertreterFür den Hibernate-Benutzer nicht so auffällig, aber ihr Beitrag war noch schwerwiegender. Wenn Sie ein oder mehrere bestimmte Objekte von Hibernate anfordern, gibt es Ihnen einfach einen Stub (Proxy) zurück und fängt alle Aufrufe seiner Methoden ab.

Dies ermöglichte die Implementierung verschiedener Lazy-Loading-Mechanismen und steigerte die Geschwindigkeit und Effizienz von Hibernate auf ein für die damalige Zeit völlig himmelhohes Niveau. Hibernate ist nicht nur zu einem De-facto-Industriestandard geworden, sondern wird auch in andere Sprachen übersetzt. So erschien beispielsweise das Framework NHibernate für C#.

1.3 Entstehung von JPA

De facto folgte de jure Anerkennung. Die JDK-Entwickler beschlossen, eine Spezifikation für die korrekte Zuordnung von Objekten zu Tabellen in einer Datenbank zu erstellen. Diese Spezifikation heißtJPA- Java-Persistenz-API.

Genau das ist die Spezifikation. Es beschreibt, wie alles funktionieren sollte und welche Anmerkungen wir benötigen, um verschiedene Teile der Klasse zu markieren, wenn ihre Objekte in der Datenbank gespeichert werden sollen.

Es scheint, dass die Jungs einfach Hibernate als Grundlage genommen und daraus die Paketnamen geändert haben. Weil alle Anmerkungen, die sich im Ruhezustand befanden, fast nacheinander nach JPA verschoben wurden.

Heute implementiert Hibernate die gesamte JPA-Spezifikation vollständig sowie einige zusätzliche Funktionen, die die Arbeit damit noch komfortabler machen. Daher können wir im Hinblick auf die Standardisierung sagen, dass Hibernate über zwei Funktionssätze verfügt:

  • JPA-Standard
  • Hibernate Native API (zusätzliche Funktionalität)

Die offizielle Hibernate-Dokumentation beschreibt es so:

Aufgrund meiner Erfahrung und nach erneutem Lesen der Hibernate-Dokumentation kann ich jedoch sagen, dass JPA und Hibernate API zu 95 % identisch sind. Es sind einfach identische Konzepte.

1.4 Maven für Hibernate

Da ich Hibernate so sehr gelobt habe, denke ich, dass es an der Zeit ist, etwas intensiver damit zu arbeiten.

Erstens gibt es eine offizielle Seite, auf der es nur eine Menge englischsprachiger Dokumentation gibt. Sie hat natürlich eine Vorliebe für Referenzinformationen und nicht für die Ausbildung. Aber es ist immer noch besser als das Debuggen der Quellen, oder? :) :)

Anweisung:

  1. Sie öffnen den Link .
  2. Du siehst sie lange an.
  3. Zurück zu CodeGym.
  4. Sie lesen meine weiteren Vorträge.

Meine Aufgabe ist es, komplexe Dinge zu vereinfachen und mit einfachen Worten zu erklären. Und wenn du dieses Level erreicht hast, dann kann ich es schaffen.

Nun, um mit Hibernate zu beginnen, müssen Sie es zu Ihrer pom.xml hinzufügen. Bisher ist bereits die 6. Version von Hibernate verfügbar, bzw. 6.1.1, wir lernen also, wie man mit der neuesten Version arbeitet.

Fügen Sie einfach diese Zeilen zu Ihrer pom.xml hinzu:

<dependency>
	<groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
	<version>6.1.1.Final</version>
</dependency>

Wenn Sie diese Vorlesung außerhalb des Zeitfensters von 2023+ lesen, dann kann die neue Version hier heruntergeladen werden .

Wichtig! Einige der von Hibernate verwendeten Bibliotheken gelten in JDK 11 und JDK 17 als veraltet. Wenn Sie also Probleme haben, Ihr Projekt zum Laufen zu bringen, fügen Sie die folgenden Abhängigkeiten hinzu:

<dependency>
        <groupId>jakarta.xml.bind</groupId>
        <artifactId>jakarta.xml.bind-api</artifactId>
      	<version>4.0.0</version>
</dependency>

<dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
      	<version>4.0.0</version>
</dependency>

<dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.29.0-GA</version>
</dependency>