2015-08-13 7 views
12

Ich bin neu bei JPA und ich versuche, Entity Graph zu verwenden. Und ich erkannte, wenn ich Daten abrufen, muss ich angeben, welche EntityGraphType ich verwenden möchte.Was ist der Unterschied zwischen FETCH und LOAD für den Entity-Graph von JPA?

Ich lese JPA2.1 Spezifikation, aber ich bin immer noch nicht sicher, wie kann ich diese 2 Möglichkeiten richtig nutzen ...

die Frage ...

  • welche Option sollte ich verwenden, wenn Ich habe keine spezifische Anforderung?
  • Was ist die spezifische Situation, wenn ich Fetch and Load verwenden muss?

Antwort

14

Ich werde mit der Beantwortung des zweiten Teils Ihrer Frage beginnen.

Was ist die spezifische Situation, wenn ich Fetch and Load verwenden muss?

Es gibt grundsätzlich zwei Möglichkeiten, um eine Entität in JPA, eifrig Laden und lazy Laden zu laden. Beim eifrigen Laden wird eine Entität sofort geladen, wenn ihr Elternteil geladen wird. Beim verzögerten Laden wird eine Entity nur geladen, wenn ein tatsächlicher Getter für diese Entität aufgerufen wird. Hochleistungsanwendungen neigen dazu, auf Lazy-Laden ausgerichtet zu sein, da es nicht sehr angenehm ist, den Endbenutzer darauf warten zu lassen, dass eine ganze Tabelle oder sogar eine Gruppe von Tabellen beim Start der Anwendung geladen wird. Nun zu Ihrer zweiten Frage.

Sie geben FETCH als Ihre Strategie an, indem Sie javax.persistence.fetchgraph in die Datei importieren, die die Entität enthält. In diesem Fall werden alle in Ihrem Entitätsdiagramm angegebenen Attribute wie FetchType.EAGER behandelt und alle angegebenen Attribute nicht werden als FetchType.LAZY behandelt. Wenn Sie jedoch LOAD als Ihre Strategie angeben, indem Sie javax.persistence.loadgraph importieren, sind alle im Entitätsdiagramm angegebenen Attribute ebenfalls FetchType.EAGER, aber nicht angegebene Attribute verwenden ihren angegebenen Typ oder Standard, wenn die Entität nichts angegeben hat.

Welche Option sollte ich verwenden, wenn ich keine spezifische Anforderung habe?

Das besagt, es ist unwahrscheinlich, dass Sie keine spezifische Anforderung haben. Zumindest muss Ihre Webanwendung schnell ausgeführt werden. Aus diesem Grund sollten Sie das Lazy Loading bevorzugen. Die Verwendung eines FETCH Diagramms ist eine gute Option, da es standardmäßig auf "lazy loading" mit Ausnahme von in den wenigen Spezialfällen verweist, in denen Sie ein Attribut als eifrig geladen erachten.

Hier ist eine link to a great blog, die all dies im Detail erklärt, zusammen mit Codebeispielen.

+0

Vielen Dank für die Beantwortung der Frage! Ich könnte verstehen, wie ich diese Optionen richtig verwenden sollte. Ich dachte, dass, wenn ich fetch-Option verwende, kann ich nicht Sub-Klasse Daten abrufen, aber ich kann es immer noch tun, wenn ich Getter-Methode aufrufen, aber Daten werden aus der Datenbank abgerufen, wenn ich Getter aufrufen, nicht Elternklasse laden. –