Ich habe Hibernate Entities, die in etwa so aussehen (getters und setter sind weggelassen):
%Vor%Wenn ich nach EntityA frage, wird es geladen, wobei die übergeordnete Zuordnung durch einen Hibernate-Proxy ersetzt wird (wie es Lazy ist). Wenn ich auf die ID des Elternteils zugreifen möchte, führe ich den folgenden Aufruf aus:
%Vor%Wie ich weiß, sollte dieser Aufruf NICHT einen Roundtrip zur Datenbank machen, da die ID in der EntityA-Tabelle gespeichert ist und der Proxy nur diesen Wert zurückgeben sollte. In meinem Fall erzeugt dies jedoch eine SQL-Anweisung, die EntityB abruft und erst dann die ID zurückgibt.
Wie kann ich das Problem untersuchen? Was sind mögliche Ursachen für dieses falsche Verhalten?
Wie ich weiß, sollte dieser Aufruf NICHT einen Roundtrip zur Datenbank machen, da die ID in der EntityA-Tabelle gespeichert ist und der Proxy nur diesen Wert zurückgeben sollte.
Verwenden Sie den Eigenschaftenzugriffstyp . Das Verhalten, auf das Sie stoßen, ist eine "Einschränkung" des Feldzugriffstyps. Hier ist, wie Emmanuel Bernard es erklärte:
Das ist bedauerlich, aber erwartet. Das ist eine der Einschränkungen beim Zugriff auf Feldebene. Grundsätzlich haben wir keine Möglichkeit zu wissen, dass getId () tatsächlich nur auf das ID-Feld zugreift. Also müssen wir das gesamte Objekt laden, um sicher zu sein.
Also ändere deinen Code in:
%Vor%Was Sie sagen, macht Sinn - dass es keinen DB-Treffer geben würde, da EntityA die Eltern-ID enthält. Ich bin nur nicht sicher, ob der getParent () -Aufruf tatsächlich das EntityB-Objekt lädt, unabhängig davon, ob Sie nur an der ID interessiert sind. Sie könnten versuchen, die Children-Sammlung (und alle anderen Felder) als Lazy zu markieren, wenn Sie den DB-Treffer speichern möchten.
%Vor%Tags und Links java hibernate proxy orm lazy-loading