Sie sind hier: Hibernate Proxies

Hibernate Proxies

In den folgenden 4 Kapiteln erläutere ich kurz das Proxyobjekt und die damit verbundenen Fallen für einen Sorftwareentwickler in der Projektpraxis.

1. Was sind Proxies?
2. Falle Attributdirektzugriff
3. Falle instanceOf
4. Falle getClass() equals getClass()

1. Was sind Proxies?

Ein Proxyobjekt ist ein Stellvertreter, der den Zugriff auf das eigentliche Objekt kontrolliert und die gleiche oder eine erweiterte Schnittstelle bietet. Operationen werden an dem Stellvertreter aufgerufen, der dadurch in der Lage ist, die Operation an das eigentliche Objekt zu delegieren und um zusätzliche Funktionalitäten zu erweitern. Ein typischer Einsatz dieses Pattern ist z.B. der Securitycheck auf Methodenebene, das Logging oder Initialisieren im Falle von Lazyloading.

In Hibernate ist das Layzyloading mittels des Entwurfsmusters Proxy / Stellvertreter implementiert und spielt dadurch eine zentrale Rolle bei der Verwendung von Hibernate. Das Ziel des Lazyloadings, Ressourcen zu sparen, wird dadurch erreicht, dass Daten erst aus der Datenbank geladen werden, wenn sie auch tatsächlich benötigt werden. Realisiert wird das Lazyloading indem beim Instanzieren eines Objektes zwar alle referenzierten Objekte ebenfalls instanziert werden, jedoch jeweils nur die ObjektId gesetzt wird. Erst beim ersten Zugriff auf ein Attribute diese Objekte (ausser auf die ObjektId) werden die tatsächlichen Daten geladen und am Objekt gesetzt.
Die hierfür notwendige Statusüberwachung (loaded, dirty...) dieser Objekte erfolgt über Proxyobjekte, welche die eigentlichen Objekte um interne Attribute erweitern.

Dieses Vorgehen von Hibernate führt in der Praxis sehr häufig zu Programmfehlern, erfordert es doch vom Softwareentwickler genaue Kenntnisse über den Sachverhalt und eine entsprechende Berücksichtigung bei der Implementierung.

Nachfolgend zeige ich die typischen Probleme und deren Lösungen beispielhaft an der einfachen Klasse Person auf.

Datenbanktabelle und Javaklasse:

Person.hbm.xml: