Was ist objektrelationales Mapping (ORM)?
ORM, Object-Relational Mapping
Objektrelationales Mapping ist eine Technik, bei der eine Bibliothek Klassen deiner Anwendung auf Tabellen einer relationalen Datenbank abbildet und die passenden SQL-Anweisungen erzeugt, statt dass du sie von Hand schreibst.
Ein Aufruf, der im Code nach einer harmlosen Schleife aussieht, schickt hinterher hunderte Abfragen an die Datenbank. Genau dort wird ein ORM zum Thema.
KI-generiertDieses Bild wurde mit KI erzeugt · Yves Hoppe / KI / cmt
- Bekannte Vertreter
- Hibernate, Entity Framework, Doctrine, Prisma
- Bildet ab
- Klassen auf Tabellen, Beziehungen auf Schlüssel
- Klassiker
- N+1-Abfragen durch nachgeladene Beziehungen
- Grenze
- Auswertungen und Massenänderungen
Entity, Persistenzkontext, Beziehungen
In Java ist die Schnittstelle dafür JPA, umgesetzt meist durch Hibernate. Eine Klasse wird als Entity markiert, ihre Felder werden Spalten, und eine Kennung dient als Primärschlüssel. Beziehungen bekommen eigene Annotationen: OneToMany für die Positionen einer Bestellung, ManyToOne für den Weg zurück.
Die Objekte leben in einem Persistenzkontext. Solange sie dort verwaltet sind, verfolgt das ORM Änderungen und schreibt sie beim Commit zurück, ohne dass ein Update im Code steht. Das ist bequem und die Quelle vieler Überraschungen, wenn jemand ein Feld in einer Methode ändert, die eigentlich nur lesen wollte.
Lazy Loading und das N-plus-1-Problem
Beziehungen auf viele Objekte lädt JPA erst, wenn du sie anfasst, Beziehungen auf ein einzelnes Objekt dagegen sofort: OneToMany und ManyToMany stehen standardmäßig auf lazy, ManyToOne und OneToOne auf eager. Läufst du über hundert Bestellungen, zu denen jeweils ein Kunde gehört, setzt das ORM leicht hundert zusätzliche Abfragen ab, plus die eine für die Liste. Genau das ist das N-plus-1-Problem, und im Code ist es unsichtbar, weil dort nur ein Feldzugriff steht, bei eager geladenen Beziehungen nicht einmal das.
Die Lösung ist, die Beziehung schon beim Laden mitzunehmen, in JPQL über join fetch oder über einen Entity Graph. Wichtig ist die Diagnose: Schalte im Test die Ausgabe der erzeugten Anweisungen ein oder zähle sie mit. Wer die Abfragen nie sieht, merkt den Unterschied erst, wenn die Datenmenge in Produktion wächst.
Der Gegenfehler ist, alles sofort mitzuladen. Dann zieht ein einziger Zugriff halbe Objektgraphen mit, und die Abfrage wird durch die Joins breit und langsam. Die brauchbare Regel: alle Beziehungen ausdrücklich auf lazy stellen, gerade die, die von Haus aus eager sind, und pro Anwendungsfall entscheiden, was mitkommt.
Wo ein ORM nicht die richtige Antwort ist
Für Massenoperationen ist ein ORM das falsche Werkzeug. Eine Million Zeilen als Objekte zu laden, zu ändern und zurückzuschreiben, kostet ein Vielfaches einer einzigen Update-Anweisung. Für Auswertungen mit Gruppierungen und Fensterfunktionen gilt dasselbe, dort schreibst du besser direktes SQL, was JPA über native Queries erlaubt.
Ein ORM ersetzt außerdem keine SQL-Kenntnisse. Es verschiebt nur, wann du sie brauchst: nicht beim Schreiben, sondern beim Erklären, warum eine Seite drei Sekunden lädt. Wer den Ausführungsplan lesen kann, findet das in Minuten.
KI-generiertDieses Bild wurde mit KI erzeugt · Yves Hoppe / KI / cmt
Objektrelationales Mapping und was oft damit gleichgesetzt wird
JDBC ist der direkte Zugang zur Datenbank mit SQL im Code. Ein ORM setzt darauf auf, du kannst aber jederzeit auf die Ebene darunter zurückfallen, wenn eine Abfrage genau kontrolliert werden soll.
Werkzeuge wie jOOQ bauen typsicher SQL zusammen, ohne Objekte zu verwalten. Du behältst die Kontrolle über jede Anweisung und verzichtest dafür auf Änderungsverfolgung und Caching.
Das Repository ist ein Entwurfsmuster für den Zugriff auf eine Sammlung von Objekten. Spring Data setzt es über JPA um, ist aber selbst kein ORM, sondern eine Schicht darüber.
KI-generiertDieses Bild wurde mit KI erzeugt · Yves Hoppe / KI / cmt
Das erzeugte SQL bleibt deine Verantwortung
Der Unterschied zwischen einer und zweihundert Abfragen steht nicht im Quelltext. Eine Schleife über Bestellungen, die je Bestellung den Kunden anfasst, lädt diesen Kunden bei verzögertem Laden einzeln nach. Sichtbar wird das erst im Protokoll der abgesetzten Anweisungen, und deshalb gehört dieses Protokoll in der Entwicklungsumgebung eingeschaltet.
Für Auswertungen über große Mengen ist der Umweg über Objekte der falsche Weg. Eine Summe über eine Million Zeilen gehört als Abfrage in die Datenbank und nicht in eine Schleife im Anwendungsserver. Fast jedes ORM lässt daneben eigenes SQL zu, und dieser Ausweg ist kein Versagen, sondern vorgesehen.
Der dritte Punkt ist das Schema. Wer die Tabellen aus den Klassen erzeugen lässt, bekommt eine Struktur, die zur Anwendung passt und selten zu dem, was die Auswertungsseite braucht. Sobald ein zweites System auf dieselbe Datenbank schaut, führt an versionierten Migrationen und einem bewusst entworfenen Schema nichts vorbei.
Objektrelationales Mapping lernen
Wie du erzeugte Abfragen sichtbar machst und ein N-plus-1-Problem abstellst, zeigen die Trainings zu JPA und Datenbankzugriff mit Java an einem echten Datenmodell.
Die Ebene darunter, also Modell, Index und Ausführungsplan, behandeln die Kurse zu Datenbanken und SQL .
Kurse, die Objektrelationales Mapping behandeln
Häufige Fragen
Soll ich das Datenbankschema aus den Entities erzeugen lassen?
Warum sehe ich Änderungen, die ich nie gespeichert habe?
Lohnt sich ein ORM für ein kleines Projekt?
Deine Ansprechpartner
Du willst das Thema nicht nur nachschlagen, sondern anwenden können? Wir beraten dich persönlich und kostenlos.
Yves Hoppe
Weiterbildung & Beratung
Ordnet mit dir ein, welcher Kurs zu deinem Vorwissen passt.
Norbert Jansen
Beratung & Inhouse
Plant Inhouse-Trainings, die an euren eigenen Daten und Abläufen ansetzen.
Objektrelationales Mapping im Kurs statt im Lexikon
Nachschlagen bringt dich bis zum Verstehen. Anwenden lernst du an echten Aufgaben.