Interviewfrage für Java-Entwickler

Dein Endpoint setzt hunderte Queries pro Request ab. Wie kommt es dazu mit JPA und wie behebst du es?

Worauf der Interviewer abzielt, wie du deine Antwort aufbaust und ein gesprochenes Beispiel zum Anpassen.

Kurzantwort

Das ist das N-plus-eins-Problem: eine Query lädt die Parent-Zeilen, und dann löst jeder Zugriff auf eine lazy Assoziation eine weitere Query pro Zeile aus. Behebe es, indem du die Assoziation in derselben Query mit einem Join Fetch oder einem Entity Graph mitlädst, indem du eine Batch Fetch Size setzt, damit Hibernate Assoziationen in Gruppen lädt, oder indem du direkt in ein DTO projizierst, das nur die benötigten Spalten hat. Halt Assoziationen standardmäßig lazy und lad pro Use Case gezielt eager.

Warum Interviewer das fragen

Das ist der häufigste Performance-Bug in Spring- und Hibernate-Anwendungen, der Interviewer will also wissen, ob du ihn in den Logs erkennst und behebst, ohne alles auf eager zu drehen. Sie wollen hören, dass die Fetch-Strategie zur Query gehört und nicht ins Mapping, dazu Bewusstsein für die verwandten Probleme: lazy Initialisierung außerhalb einer Session, Open Session in View und kartesische Produkte durch das Joinen zweier Collections.

So baust du deine Antwort auf

  • Benenn das Muster und erklär, was die zusätzlichen Queries auslöst.
  • Nenn die Fixes der Reihe nach: Join Fetch, Entity Graph, Batch Size, Projektion.
  • Besteh darauf, dass Mappings lazy bleiben und die Queries das Laden entscheiden.
  • Erwähne die Erkennung: SQL loggen oder die Query-Anzahl in Tests prüfen.

Beispielantwort

Gesprochenes Beispiel, erste Person

Das ist N plus eins. Ich lade eine Seite Bestellungen in einer Query, dann greift der Serializer bei jeder auf order.getItems zu, und weil die Assoziation lazy ist, geht Hibernate für jede einzelne Bestellung erneut los. Aus zwanzig Bestellungen werden einundzwanzig Queries, und es fällt erst mit echten Daten auf. Der erste Fix ist, alles Nötige in einem Rutsch zu laden, entweder eine Query mit Join Fetch oder ein benannter Entity Graph auf der Repository-Methode, damit die Items zusammen mit den Parents kommen. Brauche ich zwei getrennte Collections, joine ich nicht beide, weil das die Zeilen zu einem kartesischen Produkt vervielfacht; stattdessen setze ich eine Batch Fetch Size, damit Hibernate sie in Batches von, sagen wir, fünfzig mit einer in-Klausel lädt, das sind zwei Queries statt hundert. Oft ist die eigentliche Antwort, dass der Endpoint gar keine Entities braucht, dann projiziere ich direkt in ein DTO mit genau den benötigten Spalten. Was ich nicht mache, ist das Mapping auf eager umzustellen, denn das repariert einen Endpoint und verlangsamt jeden anderen. Ehrlich halte ich mich, indem ich Query-Anzahlen in einem Integrationstest prüfe.

Steht dieses Vorstellungsgespräch bald an? GhostPilot hört bei deinem Live-Call mit, erkennt die Frage in dem Moment, in dem sie gestellt wird, und bringt dir eine strukturierte Antwort in Echtzeit auf den Bildschirm. Probier es im nächsten Mock aus, oder hol dir einen $29 Session Pass, kein Abo, für den Ernstfall.

So funktioniert es

Nachfragen, mit denen du rechnen solltest

  • Was ist eine LazyInitializationException und wie vermeidest du sie sauber?
  • Warum gilt Open Session in View als schädlich?
  • Wie würdest du eine Query pagen, die zusätzlich eine Collection per Join Fetch lädt?

Weitere Fragen für Java-Entwickler

Dein Interviewer stellt seine eigene Version davon. Kopier deine echte Stellenbeschreibung in den kostenlosen Question Predictor und bekomm die 20 Fragen, die diese Rolle am wahrscheinlichsten stellt, samt dem, worauf jede wirklich abzielt.

Meine Fragen vorhersagen

Üb die harten Fragen, bevor sie gestellt werden

Trainier mit einem Live-Copiloten und geh dann vorbereitet rein. Ein $29 Session Pass bringt dich durch das Vorstellungsgespräch, ohne Abo und ohne Bindung.

GhostPilot holen