Letzte Woche hat mein Kollege Albert Sikkema über die Verwendung von UUIDs als Primärschlüssel gebloggt. Interessantes Thema, vielen Dank noch einmal, Albert! Diese Woche setze ich die Reihe der JPA-Implementierungsmuster fort, indem ich die relativen Vorzüge des Feldzugriffs gegenüber dem Eigenschaftszugriff erörtere. Die JPA-Spezifikation erlaubt dem Persistenzanbieter zwei Möglichkeiten, auf den persistenten Zustand einer Entität zuzugreifen. Der Persistenzprovider kann entweder JavaBeans-ähnliche Property-Accessors (Getter und Setter) aufrufen oder direkt auf die Instanzfelder der Entität zugreifen. Welche Methode verwendet wird, hängt davon ab, ob Sie die Eigenschaften oder die Felder einer Entität annotiert haben.
Die JPA 1.0-Spezifikation erlaubt es Ihnen nicht, Zugriffsarten innerhalb einer Entität oder sogar einer Entitätshierarchie zu mischen. Wenn Sie sowohl Felder als auch Eigenschaften annotiert haben, ist das Verhalten undefiniert. Die
- Kapselung - Es heißt, dass der Zugriff auf Eigenschaften eine bessere Kapselung ermöglicht, weil der direkte Zugriff auf Felder schlecht ist, oder? Nun, tatsächlich zwingt Sie die Verwendung von Property Access dazu, Getter und Setter für alle Ihre persistenten Eigenschaften zu schreiben. Diese Methoden ermöglichen es nicht nur dem JPA-Anbieter, die Felder zu setzen, sondern auch jedem anderen Benutzer Ihrer Entitätsklasse, dies zu tun! Die Verwendung von Feldzugriff ermöglicht es Ihnen, nur die Getter und Setter zu schreiben, die Sie wollen (sie sind böse, erinnern Sie sich?) und sie auch so zu schreiben, wie Sie es wollen, z.B. durch eine Validierung in Ihren Settern oder eine Berechnung in Ihren Gettern. Wenn Sie dagegen diese Methoden bei der Verwendung von Property Access intelligenter machen , ist das nur eine Frage der Zeit.
- Leistung - Manche Leute bevorzugen den Feldzugriff, weil er angeblich eine bessere Leistung als der Eigenschaftszugriff bietet. Aber das ist ein sehr schlechter Grund, den Feldzugriff zu wählen. Moderne optimierte JVMs machen den Eigenschaftszugriff genauso schnell wie den Feldzugriff und Datenbankaufrufe sind in jedem Fall um Größenordnungen langsamer als Feldzugriffe oder Methodenaufrufe.
- Lazy Loading in Hibernate - Die Lazy Loading-Implementierung von Hibernate initialisiert ein Lazy Proxy immer, wenn eine Methode auf diesem Proxy aufgerufen wird. Die einzige Ausnahme hiervon ist die Methode, die mit der Option @Id annotiert ist, wenn Sie den Eigenschaftszugriff verwenden. Wenn Sie jedoch Feldzugriff verwenden, gibt es keine solche Methode und Hibernate initialisiert den Proxy auch dann, wenn Sie die Methode aufrufen, die die Identität der Entität zurückgibt. Während einige
vorschlagen, den Eigenschaftszugriff zu verwenden , bis dieserFehler behoben ist, bin ich nicht dafür, Design-Entscheidungen auf Framework-Fehlern zu gründen. Wenn dieser Fehler Ihre Leistung wirklich beeinträchtigt, können Sie versuchen, die ID der Entität mit folgendem Code zu ermitteln:Serializable id = ((HibernateProxy) entity).getHibernateLazyInitializer().getIdentifier()
Das ist zwar unschön, aber zumindest wird dieser Code dort lokalisiert, wo Sie ihn wirklich brauchen. - Feldzugriff in Hibernate - Es ist gut zu wissen, dass der Feldzugriff für Hibernate zwar in Ordnung ist, um Ihre Entitäten zu füllen, dass Ihr Code aber dennoch über Methoden auf diese Werte zugreifen sollte. Andernfalls tappen Sie in die erste der von meinem Kollegen Maarten Winkels erwähnten Hibernate-Proxy-Fallen.
Zusammenfassend bin ich der Meinung, dass der Feldzugriff der richtige Weg ist, da er eine bessere Kapselung bietet (ohne ihn ist eine ordnungsgemäße Verwaltung bidirektionaler Assoziationen unmöglich) und die Auswirkungen auf die Leistung vernachlässigbar sind (Platz 1 der Top 10 der Leistungsprobleme ist immer noch das Zusammenspiel zwischen der Datenbank und Ihrer Java-Anwendung). Der einzige Nachteil sind einige Fehler in der Hibernate-Implementierung von Lazy Loading, bei der Sie besonders vorsichtig sein müssen, wenn Sie Feldzugriffe verwenden. Welche Zugriffsart bevorzugen Sie? Sehen Sie einen Unterschied in der Art und Weise, wie Feldzugriff und Eigenschaftszugriff in anderen JPA-Anbietern als Hibernate implementiert sind? Bitte lassen Sie es mich wissen, indem Sie unten einen Kommentar hinterlassen. Wir sehen uns im nächsten Blog über JPA-Implementierungsmuster, in dem ich über die Abbildung von Vererbungshierarchien in JPA sprechen werde. Eine Liste aller Blogs zu JPA-Implementierungsmustern finden Sie in der Zusammenfassung der JPA-Implementierungsmuster.
Verfasst von
Vincent Partington
Unsere Ideen
Weitere Blogs
Contact



