Gefällt Ihnen dieses papier und der download? Sie können Ihre eigene PDF-Datei in wenigen Minuten kostenlos online veröffentlichen!Anmelden
Datei wird geladen, bitte warten...
Zitiervorschau
open source library
Java-Persistence-API mit Hibernate
open source library Open Source Software wird gegenüber kommerziellen Lösungen immer wichtiger. Addison-Wesley trägt dieser Entwicklung Rechnung mit den Büchern der Open Source Library. Administratoren, Entwickler und User erhalten hier professionelles Know-how, um freie Software effizient einzusetzen. Behandelt werden sowohl Themen wie Betriebssysteme, Netzwerke und Sicherheit als auch Programmierung. Eine Auswahl aus unserem Programm:
Durch die Verwendung von Groovy sind Sie als Entwickler mit Grails in der Lage, Webanwendungen mit einem wesentlich geringeren Aufwand zu entwickeln, als beispielsweise mit Struts. Dabei setzt Grails auf so mächtige Technologien wie Spring, Hibernate und Sitemesh. Schließlich ermöglicht Grails, anders als Ruby on Rails, ein unproblematisches Zusammenspiel mit normalen Javaklassen ebenso wie mit Applikationsservern oder Webcontainern wie z.B. JBoss oder Tomcat und bietet damit einen sehr leichten Einstieg gerade für Javaentwickler.
Grails Stefan Roock, Bernd Schiffer ca. 300 Seiten Euro 29,95 (D), 30,80 (A) ISBN 978-3-8273-2498-6
Dieses Buch bietet eine praktische Einführung in die Arbeit mit Eclipse und zeigt zunächst, wie man mit Eclipse eigene Applikationen schnell und effizient erstellen kann. Es wendet sich an Java-Programmierer – vom Studierenden bis hin zum Profi –, die eigene Desktop-Applikationen oder Eclipse-Plugins entwickeln wollen. Kenntnisse in Java und in der objektorientierten Programmierung werden vorausgesetzt.
Eclipse in der Java-Entwicklung Patrick Kiwitter ca. 380 Seiten Euro 34,95 (D), 36,00 (A) ISBN 978-3-8273-2490-0
Java-Persistence-API mit Hibernate Standardisierte Persistenz
An imprint of Pearson Education München • Boston • San Francisco • Harlow, England Don Mills, Ontario • Sydney • Mexico City Madrid • Amsterdam
open source library
Bernd Müller, Harald Wehr
Die Deutsche Bibliothek – CIP-Einheitsaufnahme Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über abrufbar. Die Informationen in diesem Produkt werden ohne Rücksicht auf einen eventuellen Patentschutz veröffentlicht. Warennamen werden ohne Gewährleistung der freien Verwendbarkeit benutzt. Bei der Zusammenstellung von Texten und Abbildungen wurde mit größter Sorgfalt vorgegangen. Trotzdem können Fehler nicht ausgeschlossen werden. Verlag, Herausgeber und Autoren können für fehlerhafte Angaben und deren Folgen weder eine juristische Verantwortung noch irgendeine Haftung übernehmen. Für Verbesserungsvorschläge und Hinweise auf Fehler sind Verlag und Herausgeber dankbar. Alle Rechte vorbehalten, auch die der fotomechanischen Wiedergabe und der Speicherung in elektronischen Medien. Die gewerbliche Nutzung der in diesem Produkt gezeigten Modelle und Arbeiten ist nicht zulässig. Fast alle Hardware- und Softwarebezeichnungen und weitere Stichworte und sonstige Angaben, die in diesem Buch verwendet werden, sind als eingetragene Marken geschützt. Da es nicht möglich ist, in allen Fällen zeitnah zu ermitteln, ob ein Markenschutz besteht, wird das ® Symbol in diesem Buch nicht verwendet. Umwelthinweis: Dieses Produkt wurde auf chlorfrei gebleichtem Papier gedruckt. Um Rohstoffe zu sparen, haben wir auf Folienverpackung verzichtet.
Vorwort Hibernate hat sich in den letzten Jahren zu dem Standard-Framework im Bereich des OR-Mappings entwickelt. Viele Konzepte Hibernates haben die überarbeitete Version der Persistenz innerhalb der Java-Enterprise-Edition maßgeblich geprägt, allen voran das Ziel, dass leichtgewichtige Objekte, sogenannte POJOs (Plain Old Java Objects), persistent gemacht werden können. Die in EJB 2.1 definierte, komplexe und oft kritisierte Persistenz ist damit in EJB 3.0 einer einfach einzusetzenden Persistenz gewichen. Die Persistenz innerhalb der EJB-Spezifikation wurde in eine eigene Spezifikation ausgegliedert, das Java-Persistence-API (JPA). Dieses Buch führt in die Realisierung von Anwendungen auf der Basis von JPA ein. Es ist daher möglich, verschiedene JPA-Implementierungen für die Beispiele des Buches oder allgemeiner die Anwendungsentwicklung mit JPA zu verwenden. Hibernate ist eine solche Implementierung und die, die wir verwenden werden. Spezifikationen, bei deren Definition mehrere Firmen mitwirkten, sind in der Regel der kleinste gemeinsame Nenner der gewünschten, aber auch innerhalb der Spezifikationsmitglieder durchsetzbaren Anforderungen. Hibernate ist seit Version 3.2 eine spezifikationskonforme JPA-Implementierung, geht aber zum Teil über die Spezifikation hinaus. Innerhalb des Buches verwenden wir derartige Möglichkeiten von Hibernate, weisen dann aber explizit darauf hin. Das Buch stellt somit eine Einführung in JPA und Hibernate dar. Soweit möglich, orientieren wir uns am Standard der JPA. Sofern Hibernate sinnvolle Erweiterungen bereitstellt, werden auch diese an den entsprechenden Stellen diskutiert.
Dieses erste Kapitel führt Sie in die Ziele des Buches und die Wege zu ihrer Erreichung ein. Wir geben einen Überblick über die Struktur des Buches selbst, motivieren die Sinnhaftigkeit eines Einsatzes von JPA und beleuchten die Entwicklungsgeschichte sowohl von JPA als auch von Hibernate. Ungeduldige Leser können bereits nach dem ersten Kapitel ihr erstes JPA-Programm schreiben bzw. ein von uns zur Verfügung gestelltes Programm als Ausgangspunkt für Eigenentwicklungen verwenden.
1.1
Über dieses Buch
1.1.1
Spezifikationen und Standards
Die Java-2-Platform Enterprise-Edition (J2EE) in der Version 1.4 enthält die Enterprise-JavaBean-Spezifikation (EJB) 2.1. Das darin definierte Komponentenmodell für Session- und Entity-Beans wurde häufig kritisiert, wie z.B. in [8] und führte zur Entwicklung alternativer Frameworks, wie z.B. Spring. Kritisiert wurde unter anderem die komplexe Konfiguration auf XML-Basis, die Notwendigkeit der Implementierung bestimmter Schnittstellen und die schlechte Testbarkeit außerhalb des EJB-Containers. Hibernate und andere Open-Source-Implementierungen von Persistenz-Frameworks haben aufgrund dieser Kritik stark an Verbreitung zugenommen. Die nach Umbenennung und Neuversionierung nunmehr Java-Platform, Enterprise-Edition (Java-EE) genannte nächste Version 5.0, veröffentlicht als JSR-220, nahm die Kritik auf, realisierte die Persistenz grundlegend neu und vermied dabei die genannten Kritikpunkte weitgehend. Die Persistenz wurde in einer eigenen Spezifikation, dem Java-Persistence-API (JPA), festgelegt. Hibernate bzw. das Hibernate-Team wird in Kapitel 1 dieser Spezifikation explizit an erster Stelle der Beitragenden genannt. JPA stellt nicht nur eine Persistenz innerhalb eines EJB-Containers bereit, sondern ist auch in Java-SE einsetzbar. Wir werden in diesem Buch als Laufzeitumgebung größtenteils Java-SE, zum Teil aber auch Java-EE verwenden. Der überwiegende Teil der Beispiele stammt daher aus dem Bereich Java-SE. Die Beispiele sind in der Regel auch in Java-EE lauffähig, müssen aber unter Umständen noch geändert oder ergänzt werden, z.B. um JNDIZugriffe oder die Definition von Datenquellen (Java-EE-Datasources).
open source library
1 Einführung
Mit der Veröffentlichung von Java-SE 5.0 wurden Annotationen (JSR-175) Teil der Sprache. Java-EE 5.0 und JPA machen von Annotationen ausgiebig Gebrauch. Der Anteil von Konfigurationsdateien in XML nahm damit drastisch ab. Mit Java-Data-Objects (JDO, JSR-12 und JSR-243) existiert bereits seit einigen Jahren ein Persistenz-Framework für Java, das nicht auf relationale Datenbanken beschränkt ist, sondern etwa auch objektorientierte Datenbanken, Dateisysteme oder ERP-Systeme unterstützt. Durch die große Verbreitung von Java-EE scheint sich JDO aber nicht durchsetzen zu können. Hibernate ist seit Version 3.2 JPA-konform. Wir verwenden in diesem Buch JPA, wo immer möglich. Wenn es uns zweckmäßig erscheint, gehen wir jedoch über den Standard hinaus und verwenden direkt ein Hibernate-API. Wir sind der Meinung, dass in der Software-Entwicklung möglichst Standards zu berücksichtigen sind. Wir sehen aber auch, dass Implementierungen von Standards sehr oft über die Standards hinausgehen. Bestes Beispiel ist SQL, standardisiert und doch von Implementierung zu Implementierung verschieden. Eine Motivation für Hibernate war gerade, die Unterschiede zwischen SQL-Implementierungen nicht bis zum Java-API durchdringen zu lassen. Wenn wir Hibernate-APIs verwenden, machen wir dies explizit. Sie haben dadurch die Möglichkeit, sich im Rahmen Ihrer Randbedingungen für den Standard oder für die erweiterte Funktionalität zu entscheiden. Während des Schreibens der letzten Zeilen dieses Buches wurden drei neue JavaSpecification-Requests initiiert und zur Bearbeitung angenommen: JSR-316 (Java-EE 6), JSR-317 (JPA 2.0) und JSR-318 (EJB 3.1). Der für uns wichtige JSR-317 hat unter anderem die Integration eines APIs für kriterienbasierte Abfragen und eine erweiterte Validierungsunterstützung zum Ziel. Beides behandeln wir auf der Basis von Hibernate in den Abschnitten 7.7.1 und 9.1 und sehen uns damit in der Themenauswahl für dieses Buch bestätigt. Das Herauslösen von JPA aus der EJB-Spezifikation macht deutlich, dass der eingeschlagene Weg der Separierung der Persistenz aus dem Bereich Java-EE weitergegangen und vollendet wird. Wir behandeln JPA 1.0 sowohl in Java-SE als auch Java-EE.
1.1.2
Das Buch im Netz
Bücher zu Themen der Software-Entwicklung müssen möglichst aktuell sein. Gerade der Open-Source-Bereich ist durch hochfrequente Update-Zyklen gekennzeichnet. Wir erachten es als nicht sinnvoll, unserem Buch eine CD beizulegen. Vielmehr betreiben wir im WWW die Website www.jpa-hibernate.de
Sie finden dort den Quellcode für alle im Buch dargestellten Programme. Die für die Beispiele benötigten Bibliotheken finden Sie ebenfalls dort. Falls Sie als Dozent tätig sind und unser Buch verwenden, berichten Sie uns bitte über Ihre Erfahrungen damit. Spezielle Themen oder Erweiterungsvorschläge für die nächste Auflage sind uns willkommen. Sind Sie als Entwickler tätig und setzen unser
18
Buch im „Tagesgeschäft“ ein, sind wir ebenfalls an Ihren Erfahrungen und Verbesserungsvorschlägen interessiert. Wenn Ihre Zuschriften eine kritische Masse erreichen, werden wir uns bemühen, einen Forumsbereich auf der Website einzurichten. Zu guter Letzt werden Sie, wenn nötig, dort ein Druckfehlerverzeichnis und eventuell notwendig werdende Aktualisierungen für das Buch finden.
1.1.3
Zur Sprache
Dieses Buch ist in Deutsch geschrieben. Die Sprache der Informatik ist aber Englisch. Wir versuchen so weit wie möglich, englische Begriffe und Anglizismen zu vermeiden. Dies ist insbesondere bei Fachbegriffen, für die keine deutsche Entsprechung existiert, und bei Namen schlecht möglich. Das Wort „Entity“ mit „Entität“ oder „Bean“ mit „Bohne“ zu übersetzen, erscheint uns nicht sinnvoll, da beides Eigennamen mit feststehender Bedeutung sind. Ein weiterer sprachlicher Stolperstein ist die Bildung zusammengesetzter Wörter. Im Englischen werden diese getrennt, im Deutschen zusammengeschrieben, aus Gründen der besseren Lesbarkeit auch mit Bindestrich. Aus „Java Persistence API“ im Englischen wird daher im Deutschen „Java-Persistence-API“. Die getrennt geschriebene Aneinanderreihung mehrerer Substantive ist im Deutschen nicht möglich. Wir sehen den Konflikt bei der Verwendung von Eigennamen, wie etwa „Java Persistence API“, ziehen die Bindestrichnotation aber vor, da sonst Problemfälle wie „Java Persistence API-Implementierung“ entstehen, deren Zusammenhang beim ersten Lesen oder bei Zeilenumbrüchen nicht mehr offensichtlich ist. Der letzte Punkt in Sachen Sprache ist die zweigeschlechtliche Ansprache. In Prüfungsordnungen von Hochschulen liest man in der Regel, dass Studentinnen und Studenten von Prüferinnen und Prüfern geprüft werden, die Professorinnen oder Professoren sein können. Wir wollen Ihnen und uns dies ersparen und sprechen Sie ausschließlich aus Gründen besserer Lesbarkeit mit grammatikalisch männlichem Geschlecht an. Unter einem Leser oder einem Entwickler verstehen wir eine Person, die liest oder entwickelt, völlig unabhängig vom Geschlecht.
1.1.4
Der Leser
Dieses Buch hat seine Wurzeln in Hochschullehrveranstaltungen, die wir in den Bereichen Datenbanken und Objektpersistenz durchgeführt haben. Es eignet sich daher besonders gut für die Unterstützung von Lehrveranstaltungen in Informatik-, Bindestrichinformatik- und Software-Technik-Studiengängen an Universitäten und Fachhochschulen. Wir führen aber auch Schulungen für Unternehmen in den Bereichen Java und Objektpersistenz durch, so dass wir die Ansprüche an solche Schulungen ebenfalls kennen. Auch als im Berufsleben stehender Praktiker werden Sie sicher viel Wissenswertes und Neues in diesem Buch erfahren können. Java ist, was den Sprachkern und die Syntax angeht, eine einfache und sehr gut konzipierte Sprache. Die Anzahl und der Umfang der APIs wächst jedoch zusehends und lässt sich wahrscheinlich von einer einzelnen Person nicht mehr in vollem Umfang
19
open source library
1.1 Über dieses Buch
open source library
1 Einführung
beherrschen. Wenn Sie mit dem Gedanken der Anschaffung dieses Buches spielen oder es bereits angeschafft haben, sollten Sie Java beherrschen bzw. im Augenblick dabei sein, es zu lernen. Kenntnisse der APIs für Reflection und JDBC sind nicht unbedingt nötig, werden Ihnen jedoch helfen, Dinge besser zu verstehen. Unser Schwerpunkt des Einsatzes von JPA ist Java-SE. Für die Abstecher in Java-EE sind Kenntnisse in diesem Bereich für das Verständnis zwar nicht notwendig, aber hilfreich. Kenntnisse aus dem Bereich relationaler Datenbanken sind für das Verständnis der Buchinhalte ebenfalls sehr hilfreich. Zu guter Letzt: Warum sollten Sie dieses Buch kaufen? Weil Sie sich für eines der folgenden Themen interessieren: Java-EE, JPA, OR-Mapper oder ganz allgemein für die moderne Realisierung von Java-Systemen mit Persistenz.
1.1.5
Vollständigkeit
Die JPA-Spezifikation umfasst 256 Seiten, die Syntax und Semantik beschreiben, jedoch nicht einführen und erläutern. Das Buch Enterprise JavaBeans 3.0 von Burke und Monson-Haefel [4], das sich zum Teil auch JPA widmet, hat 730 Seiten. Das Buch Java Persistence with Hibernate von Bauer und King [1], das getrost als die „Hibernate-Bibel“ betrachtet werden kann, umfasst 830 Seiten. Wir wollen mit dem vorliegenden Buch eine Einführung in JPA und Hibernate geben, ohne vollständig zu sein. Eine Vollständigkeit in dem Sinne, dass beide APIs komplett dargestellt werden, ist in unseren Augen nicht sinnvoll. Beide APIs sind im Java-Doc-Format auf den entsprechenden Internetseiten verfügbar. Die JPA-Spezifikation wie auch das Hibernate-Referenzhandbuch sind als PDF-Dokumente ebenfalls unentgeltlich verfügbar. Auch der Rahmen von ca. 350 Seiten, den wir uns als Obergrenze gesetzt hatten, impliziert, dass keine vollständige Darstellung erfolgen kann. Wir haben aber alle für die Anwendungsentwicklung relevanten Informationen zusammengetragen und sind uns sicher, dass Sie, lieber Leser, nach Lektüre und aktivem Nachvollziehen der Beispiele dazu fähig sind, anspruchsvolle Lösungen aus dem Bereich der Persistenz in Informationssystemen auf der Basis von JPA und Hibernate zu erstellen. Die Vollständigkeit der Darstellung von JPA liegt bei praktisch 100 Prozent. Falls wir einigen Themen keine explizite Behandlung in einem gesonderten Abschnitt gewidmet haben, finden Sie in Kapitel 8 eine Aufzählung aller Annotationen und XMLTags mit einer kurzen Erläuterung. Bei Hibernate verhält es sich deutlich anders. Es ist nicht unser Ziel, ein Buch über Hibernate zu schreiben. Mit dem Buch von Bauer und King [1] liegt ein Werk vor, das Hibernate detailliert beschreibt und unserer Meinung nach nicht übertroffen, höchstens nachgeahmt werden kann. Falls Sie sich für natives Hibernate interessieren, empfehlen wir dieses Buch. Sie sollten aber bedenken, dass selbst Bauer und King als Autoren von Hibernate heute empfehlen, neue Projekte auf Basis von JPA zu beginnen und nicht mit nativem Hibernate.
1.1.6
Beispielprogramme
Alle Klassen und Codeausschnitte in diesem Buch entstammen tatsächlich existierenden Programmen. Sie können, nein Sie sollen diese Programme von den Buchseiten
20
im Web herunterladen, selbst ausprobieren und als Ausgangspunkt für eigene Entwicklungen verwenden. Wir haben uns bemüht, im Hauptteil des Buchs zunächst Konzeptionelles zu erläutern und dann in Programmtext umzusetzen. Die Programmierung selbst ist allerdings untrennbar mit Konfigurieren, Testen und Debuggen verbunden. Wir wollen Ihre praktischen Übungen nicht mit den Lernphasen vermengen und haben deshalb die Erläuterung der Beispielprogramme, soweit nötig, ausgelagert. In Abschnitt A.2 ab Seite 328 finden Sie Informationen zu den einzelnen Programmen. Sie haben daher selbst die Möglichkeit zu entscheiden, ob Sie zunächst ausschließlich den Text durcharbeiten und anschließend zum Programmieren übergehen oder diese beiden Tätigkeiten abwechselnd durchführen. Allen Beispielprogrammen gemeinsam ist, dass sie aus dem Bankenbereich stammen und damit in Teilen einander sehr ähnlich sind. Die Programme sind für die jeweiligen Themengebiete, in denen sie zum Einsatz kommen, angepasst und zum Teil minimalistisch. Es kann daher durchaus vorkommen, dass ein Kundenobjekt in einem Abschnitt mehr oder weniger Properties besitzt als in einem anderen Abschnitt, wenn dies der Kontext erfordert. Alle OR-Mapper im Allgemeinen und JPA und Hibernate im Speziellen bilden Objekte in Relationale Datenbanken ab und nicht umgekehrt. Die reale Implementierung muss die Daten in beide Richtungen bewegen können, die konzeptionelle Richtung geht aber von der objektorientierten Sprache aus hin zur Datenbank. Sie müssen daher für die Beispielprogramme keinen SQL-Code zur Definition der Tabellen schreiben, dieser wird automatisch über ein Ant-Target generiert. Wenn Sie unser erstes Beispielprogramm ausprobieren wollen, sollten Sie zunächst den allgemeinen Teil des Abschnitts A.2 überfliegen, wo wir die Ant-Targets, auch das zur Generierung der SQL-DDL-Anweisungen, erläutern. In der Praxis ist dieses Vorgehen häufig nicht möglich, da die Datenbank bereits existiert und sich in Produktion befindet. Wir beschreiben in Abschnitt 9.4 die Verwendung der Hibernate-Tools als Reverse-Engineering-Werkzeug. Das Werkzeug nimmt über JDBC Kontakt mit der Datenbank auf, erfragt Schemainformationen und generiert die für die Tabellenstrukturen benötigten Entity-Klassen. Diese sind in der Regel nicht sofort einsetzbar, da noch bestimmte Nacharbeiten vorgenommen werden müssen. Bestes Beispiel ist die Identifikation von Vererbungsbeziehungen, die aus relationalen Tabellenstrukturen nicht einfach automatisch zu berechnen sind. Dies ist allerdings nicht Thema des Buchs, so dass der zuvor beschriebene Fall der Generierung der Tabellenschemata aus den Entity-Klassen der Standardfall in unseren Beispielen ist.
21
open source library
1.1 Über dieses Buch
open source library
1 Einführung
Hinweis Bei der Darstellung von Programmtexten im Buch haben wir uns bemüht, nur die für die Erläuterung von Konzepten relevanten Ausschnitte darzustellen. Dies erfolgt zum einen in Hinblick auf die Herstellungskosten des Buchs, zum anderen aber auch aus didaktischen Gründen. Wir wollen Sie auf die wirklich wichtigen Dinge hinweisen und nicht mit seitenweisen Code-Listings ermüden. Sollten Sie, aus welchen Gründen auch immer, lieber den vollständigen Programmtext vorliegen haben, finden Sie diesen in den Beispielprojekten auf den Buchseiten im Netz.
1.1.7
Open-Source
Dieses Buch ist ein Buch über JPA und erscheint in der Open-Source-Reihe von Addison-Wesley. Dies scheint zunächst ein Widerspruch zu sein. Was hat eine Spezifikation mit Open-Source zu tun? Wie wir in Abschnitt 1.1.1 angedeutet haben, hat Hibernate als Open-Source-System gezeigt, dass es möglich ist, ein OR-Mapping in Java wesentlich einfacher umzusetzen, als dies mit EJB 2.1 möglich ist. Hibernate kann daher als eine der stärksten Triebfedern für die Erstellung der JPA-Spezifikation gesehen werden, so dass der Widerspruch schon ein wenig aufgelöst ist. Wir werden in diesem Buch ausschließlich Open-Source-Systeme einsetzen: Hibernate, HSQLDB, JBoss-AS, JBoss-Seam, Eclipse, JBoss-IDE und implizit Lucene und iText, um nur die bekanntesten zu nennen. Sie können alle Beispielprogramme des Buchs ausschließlich unter Verwendung von Open-Source-Systemen nachvollziehen und müssen kein kommerzielles Produkt erwerben. Wir denken daher, dass dieses Buch ganz ausgezeichnet in Addison-Wesleys Open-Source-Reihe passt. Wir erwähnten bereits, dass wir auch Schulungen für Entwickler in Unternehmen durchführen. Die Anforderungen von Unternehmen unterscheiden sich deutlich von den Anforderungen im Hochschulbereich. Eine dieser Anforderungen lautet, in der Praxis weit verbreitete Systeme einzusetzen. Ein weit verbreitetes Datenbanksystem ist Oracle. Einige unserer Beispiele nutzen Oracle-Eigenheiten, die in anderen Systemen nicht vorhanden sind. Obwohl Oracle kein Open-Source-System ist, können Sie sich die sogenannte Express-Edition (Oracle Database XE), eine ressourcenbeschränkte Version des vollwertigen Datenbanksystems, unentgeltlich herunterladen und installieren und so die entsprechenden Beispiele des Buchs nachvollziehen. JPA und Hibernate abstrahieren von den verschiedenen Datenbankdialekten, so dass ein erklärtes Ziel gerade die Datenbankunabhängigkeit der mit JPA und Hibernate realisierten Lösungen ist. Im Prinzip können Sie daher alle Beispielprogramme des Buchs auf allen unterstützten Datenbanksystemen (siehe Abschnitt 2.1) verwenden.
22
1.2
Motivation
1.2.1
Standards
open source library
1.2 Motivation
Seit vielen Jahren gehören objektorientierte Programmiersprachen zu den am häufigsten verwendeten Sprachen bei der Realisierung von Anwendungen im betrieblichen Umfeld. Objektorientierte Konzepte und deren Umsetzung in modernen Sprachen wie Java und C# sind nach dem aktuellen Stand der Wissenschaft und der Erfahrungen aus vielen Projekten geeignet, die Anforderungen komplexer Informationssysteme mit angemessenem Aufwand in lauffähige Anwendungen umzusetzen. Relationale Datenbanksysteme haben sich für die Datenhaltung ebenfalls als Standard etabliert, lange bevor es Java und C# gab. Eine über 30 Jahre andauernde Erfahrung in der Implementierung dieser Systeme haben zu sehr sicheren und hoch performanten Datenverwaltungssystemen geführt, die weit verbreitet sind. Die Grundlagen relationaler Datenbanksysteme sind mathematisch fundiert, die Sprache zur Definition (Data Definition Language, DDL) und Manipulation (Data Manipulation Language, DML) von Datenbanken, SQL (Structured Query Language), ist in mehreren Standards verabschiedet worden. Trotzdem sind die verschiedenen Implementierungen wie Oracle, DB/2 oder der SQL-Server keineswegs kompatibel. Die Migration einer Datenbank von einem System auf ein anderes ist in der Regel mit hohem Aufwand verbunden. Mit dem Java-Database-Connectivity-API (JDBC) entstand ein Standard, der einen Teil der Unterschiede zwischen verschiedenen Datenbanksystemen verbirgt, aber bei weitem nicht vollständig beseitigt. Mit JDBC werden auf SQL-Ebene CRUD-Operationen (Create, Read, Update, Delete) an das Datenbanksystem geschickt und die Antwort als Ergebnis der Anfrage zur weiteren Verarbeitung bereitgestellt.
1.2.2
Zwei Welten
Die objektorientierte Welt und die relationale Welt sind grundverschieden. Vererbung, dynamisches Binden, Polymorphie, Factories auf der einen, Primär- und Fremdschlüssel, kaskadierendes Löschen, Normalform auf der anderen Seite sind Vokabeln, die in der jeweils anderen Welt keine Entsprechung besitzen. Die Unverträglichkeit der beiden Paradigmen ist offensichtlich und muss in der tagtäglichen Entwicklungsarbeit überbrückt werden, so dass sich ein eigener Begriff, der des Paradigm-Mismatch, zur Benennung dieser Unverträglichkeit etabliert hat. Da das Problem genereller Natur ist, tritt es in allen Projekten auf, die mit objektorientierten Programmiersprachen auf relationale Datenbanken zugreifen. Eine singuläre Lösung ist daher nicht angebracht. Im Laufe der Jahre widmeten sich verschiedene Frameworks (Hibernate, Castor, TOPLink, IntelliBO), aber auch Spezifikationen (JDO, EJB-CMP) dem Thema. Die genannten Frameworks stellen bei weitem keine vollständige Aufzählung dar, sondern lediglich eine nicht repräsentative Nennung der bekanntesten Systeme. Mindestens 10 bis 20 solcher Frameworks sind als kommerzielle Systeme, aber auch als Open-Source-Systeme verfügbar. Dies belegt
23
open source library
1 Einführung
die Relevanz des Themas innerhalb der Anwendungsentwicklung. Wir werden auf den Paradigm-Mismatch und auf resultierende Anforderungen an das OR-Mapping in Abschnitt 1.4 eingehen.
1.2.3
Entwicklerproduktivität
Die zurzeit sich wiederbelebende und nicht zu deckende Nachfrage nach SoftwareEntwicklern macht deutlich, dass die Entwicklerproduktivität ein betriebswirtschaftlich äußerst relevanter Faktor ist. Es gilt, mit möglichst geringem Aufwand die geforderte Leistung bei der Entwicklung von Software zu erbringen. Prinzipiell ist es immer möglich, für spezielle Anforderungen ein System zu entwickeln, das in seinen funktionalen und nichtfunktionalen Eigenschaften einem allgemein einsetzbaren System überlegen ist. Die Betonung dieser Aussage liegt auf dem Wort prinzipiell. Sobald zeitliche und betriebswirtschaftliche Rahmenbedingungen zählen, was in der Praxis immer der Fall ist, werden Sie kein spezielles System implementieren können, das mit Hibernate konkurrieren kann. Hibernate blickt auf eine für Software-Systeme relativ lange Entwicklungsgeschichte zurück, die wir in Abschnitt 1.3 kurz vorstellen. Es wird sowohl als Einzelsystem als auch als Persistenzschicht des JBoss-ApplicationServers in vielen Projekten eingesetzt und genießt einen ausgezeichneten Ruf bezüglich Funktionalität und Performanz. Mit dem Einsatz von JPA und Hibernate werden Ihnen viele Routinearbeiten einer selbst implementierten Persistenzschicht abgenommen. Ein gutes Beispiel ist die Navigation über Assoziationen des Objektmodells. Hier genügen einfache GetterAufrufe anstatt komplexer SQL-Abfragen, um von einem Objekt zu einem anderen zu gelangen. Ein weiteres Beispiel ist die Überwachung von Änderungen an Objekten in der JVM, die mit der Datenbank synchronisiert werden müssen. Das eingebaute automatic Dirty-Checking entbindet Sie von dieser Überwachung und bürdet sie der JPA-Implementierung auf. Wir werden diese und viele weitere Beispiele im Verlauf des Buchs besprechen, so dass wir sicher sind, dass Sie nach Lektüre des Buchs keine guten Gründe für die Entwicklung einer eigenen Persistenzschicht finden werden.
1.3
Ein wenig Historie
Gavin King ist der konzeptionelle Kopf hinter Hibernate. Aus einer Unzufriedenheit mit der damaligen EJB-Persistenz heraus begann er 2001 die Entwicklung eines ORMapper für das Projekt, in dem er gerade tätig war. Am 19.1.2002 schickte er eine Freigabeankündigung von Hibernate in ein Forum auf theserverside.com, die es aus historischen Gründen wert ist, abgedruckt zu werden:
24
open source library
1.3 Ein wenig Historie
A new java persistence tool Posted by: Gavin King on Januar 19, 2002 I just released hibernate 0.9 on sourceforge. This is based on some code I originaly wrote to do BMP in websphere when I got sick of EJB 1.x CMP limitations (no collections or dependent objects). Its now a great alternative to things like CMP + JDO. http://hibernate.sourceforge.net Nach dieser Veröffentlichung begannen andere Entwickler ebenfalls Hibernate zu verwenden. Gemäß dem Grundsatz „von Entwicklern für Entwickler“ wurden praxisnahe Anforderungen nach und nach eingebaut und machten Hibernate sehr populär. Um dem Erfolg und den zahlreichen Anforderungen gerecht zu werden, übergab King am 17.9.2003 die Hibernate-Implementierung zur weiteren Entwicklung an JBoss. King behielt die konzeptionelle Hoheit über Hibernate und wechselte ebenfalls zu JBoss. Aufgrund des großen Erfolges von Hibernate und der zahlreichen Kritik an der EJB2-Persistenz sollte der im Sommer 2003 eingerichtete JSR-220 das Persistenzmodell von EJBs grundlegend reformieren und vor allem vereinfachen. Wir zitieren aus den Zielen des JSR-220: „The purpose of EJB 3.0 is to improve the EJB architecture by reducing its complexity from the EJB developer’s point of view.“ Gavin King war neben vielen anderen auch Mitglied der Expertengruppe des JSR-220. Das Ergebnis, die JPA 1.0, ist in der Tat als wesentlicher Fortschritt gegenüber den alten Persistenzsystemen zu sehen, wovon wir Sie im Laufe des Buchs überzeugen werden. Nach einem Eintrag in der Product-Evaluation-FAQ: Is Hibernate mature? [URL-MAT] wird Hibernate in Zehntausenden von Projekten weltweit verwendet. Über 25.000 Entwickler sind registrierte Benutzer der Hibernate-Foren, in denen durchschnittlich 150 Fragen täglich gestellt und beantwortet werden. Die Entwickler- und Benutzergemeinde kann also als sehr aktiv bezeichnet werden. Durch die attraktive Lizenz von Hibernate (LGPL, die GNU Lesser General Public License) ist davon auszugehen, dass Hibernate auch als JPA-Implementierung weite Verbreitung finden wird, obwohl Hibernate nicht die Referenzimplementierung ist. Die JPA-Referenzimplementierung ist TopLink von Oracle [URL-TOP] unter der CDDL-Lizenz (Common Development and Distribution License), die ebenfalls die Verwendung in kommerziellen Projekten erlaubt. Wir erwähnten in Abschnitt 1.1.1 bereits eine alternative Java-Persistenz-Spezifikation, die Java-Data-Objects-Spezifikation (JDO). Diese ist in Version 2.0 im JSR-243 definiert. In einem offenen Brief an die Java-Technologie-Gemeinschaft [URL-JTC] deutete Sun an, dass JDO nicht mehr weiterentwickelt und in JPA aufgehen wird. Sie, lieber Leser, sind also mit JPA auf der sicheren Seite.
25
open source library
1 Einführung
1.4
Anforderungen an das OR-Mapping
Die schon angesprochenen, grundlegenden Unterschiede zwischen objektorientierten Programmiersprachen auf der einen und relationalen Datenbanken auf der anderen Seite sowie die Etablierung beider Technologien führten in den neunziger Jahren zu Bemühungen, die beiden Welten möglichst automatisiert zu verbinden. Autoren wie Mark L. Fussel und Scott W. Ambler gehörten zu den ersten, die das Thema aufnahmen und die zu lösenden Probleme und offenen Fragen diskutierten: Wie werden Metadaten definiert? Die Definition der Abbildung soll in Form von Metadaten konfigurativ und nicht programmatisch erfolgen. Wie kann das System möglichst transparent sein? Der OR-Mapper soll etablierte Programmiermuster nicht behindern oder gar verhindern. Es sollte alles, was ohne Persistenz möglich ist, auch mit Persistenz möglich sein. Wie sieht der Lebenszyklus persistenter Objekte aus? Persistente Objekte unterscheiden sich in ihrem Lebenszyklus von nicht persistenten Objekten. Dieser Lebenszyklus sollte intuitiv und ohne großen Aufwand beherrschbar sein. Wie wird über Objektgeflechte (Assoziationen) navigiert? Objektorientierte Sprachen erlauben einfaches Navigieren über Objektgeflechte. Datenbanken unterstützen lediglich Fremdschlüsselbeziehungen. Wie wird Vererbung und Polymorphie realisiert? Die objektorientierte Vererbung ist ein in relationalen Datenbanken unbekanntes Konzept. Es müssen Wege zur Realisierung gefunden werden. Wie werden Transaktionalität und Mehrbenutzerfähigkeit sowie ein effizienter Datenzugriff gewährleistet? Der Hauptgrund des Einsatzes von Datenbanksystemen, eine sichere, auf Transaktionen basierende, mehrbenutzerfähige und extrem effiziente Verwaltung großer Datenmengen, muss trotz des Einsatzes eines OR-Mapper erhalten bleiben. Wie werden vorhandene Datenbankmechanismen (effizientes Suchen, Sortieren, Aggregieren) effizient im Programmcode nutzbar? Neben den gerade genannten allgemeinen Eigenschaften von Datenbanksystemen müssen auch speziellere Eigenschaften wie die Aggregation bei der Berichterstellung möglich sein. Wir werden all diese Fragen in den nächsten Kapiteln nochmals aufgreifen und mithilfe von JPA und Hibernate beantworten.
1.5
Das Beispiel für Ungeduldige
Wir wollen nun unser erstes Programm unter Verwendung eines OR-Mapper schreiben. Sowohl für diesen Abschnitt als auch für alle weiteren Kapitel des Buchs ver-
26
suchen wir, ein durchgehendes Beispiel zu verwenden. Die täglichen Bankgeschäfte sind allen bekannt und so vielschichtig, dass sie als Beispielanwendung geradezu prädestiniert sind. Das einführende Beispiel soll von seinem Anspruch her dem typischen Hello-WorldProgramm entsprechen: stark vereinfacht, aber trotzdem ein wenig lehrreich. Als Beispiel dient uns die schon erwähnte Fachlichkeit einer Bank bzw. einer Kontoführung. Wir beschränken uns auf die Implementierung einer Kundenklasse, d.h., die Klasse Kunde ist die einzige Klasse und das Modell enthält keine Beziehungen. Die Klasse selbst ist ebenfalls stark vereinfacht und enthält als Properties lediglich Vorname, Nachname und Geburtsdatum. Abbildung 1.1 zeigt unsere Fachlichkeit als UMLKlassendiagramm.
Abbildung 1.1: Die Klasse Kunde Wir werden das Beispiel in vier Alternativen realisieren: zunächst mit nativem Hibernate in Abschnitt 1.5.1. Dann in Abschnitt 1.5.2 mit einem JPA-annotierten Entity, das aber in der Main-Methode weiterhin mit nativem Hibernate verwendet wird. Annotationen ermöglichen es, verschiedene Sprachelemente wie Klassen, Properties oder Methoden mit Metadaten zu versehen. Annotationen sind eine mit Java-SE 5.0 eingeführte Eigenschaft der Sprache und werden in Abschnitt 1.6 erläutert. Die dritte Alternative in Abschnitt 1.5.3 verwendet ausschließlich JPA mit Annotationen, also sowohl bei der Definition als auch der Verwendung des Entity. Obwohl JPA als Standardfall die Verwendung von Annotationen vorsieht, gibt es auch die Möglichkeit der Verwendung von XML-Mapping-Dateien. Die vierte Alternative in Abschnitt 1.5.4 verwendet JPAs XML-Mapping zur Definition der Metadaten.
1.5.1
Beispiel mit Hibernates XML-Mapping
Die von Hibernate für das OR-Mapping benötigten Metadaten werden in Form einer XML-Datenstruktur angegeben. Listing 1.5.1 zeigt die Mapping-Datei für die Klasse Kunde. Die Datei erhält typischerweise den Namen der Klasse, gefolgt von „.hbm.xml“.