Sun &

Datenbankzugriff aus RCP-Anwendungen via EclipseLink

Johannes Michler, PROMATIS software GmbH

Zunächst von IBM und ab 2001 als Open-Source-Projekt unter der Führung der entwickelt, war Eclipse lange Zeit vor allem als integrierte Entwicklungsumgebung für Java bekannt. Seit Juni 2009 ist nun die aktuelle Version 3.5 für alle verbreiteten Plattformen verfügbar (Windows, Linux, Mac). Noch immer gilt Eclipse als komfortable und weit verbreitete Java-Entwicklungsumgebung mit vielfältigen Möglichkeiten, beispielsweise zur Syntaxüberprüfung und -ver- vollständigung, aber auch für Restrukturierung oder Debugging.

Aufgrund des modularen Aufbaus gibt auszuführen. Dabei steht auch eine Dieser Artikel konzentriert sich auf es für die Eclipse-Plattform eine große kontextabhängige Syntax-Vervollstän- die zweite Art von Eclipse Datenbank- Anzahl von Erweiterungen, die im Ec- digung zur Verfügung. Die Ergebnisse Erweiterungen: den Zugriff von Eclipse- lipse-Umfeld „Plugins“ genannt wer- werden, wie von ähnlichen Tools ge- RCP-Anwendungen auf Datenbanken. den. Dank dieser Erweiterungen eignet wohnt, in einer komfortablen Tabel- Hier steht im Eclipse-Umfeld mit der sich Eclipse außer für die Entwicklung lendarstellung ausgegeben. Außerdem Java-Persistence-API(JPA)-Implemen- von Anwendungen in der Java Stan- stehen Werkzeuge zur tabellarischen tierung „EclipseLink“ ein mächtiges dard Edition auch für die Enterprise Bearbeitung von SQL-Tabellen zur Ver- Werkzeug zur Verfügung. Zu dessen Version (JEE) sowie für eine Vielzahl fügung (siehe Abbildung 1). Verständnis ist im nächsten Abschnitt weiterer Programmiersprachen (bei- Neben diesen generischen Eclipse- die Entwicklung einer ersten eigenen spielsweise PHP, C/C++). Darüber hin- Werkzeugen gibt es mit jOra ein spezi- Anwendung auf Basis von Eclipse-RCP aus stehen Erweiterungen zur Model- elles Eclipse-Plugin für die Verwaltung beschrieben. Diese wird anschließend lierung (EMF) inklusive der Erstellung von Oracle Datenbanken. Mit diesem um eine Datenbank-Persistierung er- grafischer Editoren (GMF), für Re- können über DTP hinaus − ähnlich weitert. porting (BIRT), den Datenbank-Zugriff wie im Oracle SQL Developer − viel- (EclipseLink) und vieles mehr zur Ver- fältige Datenbank-Aufgaben über eine PhoneBookRCP fügung. Unter www.eclipse.org kann grafische Oberfläche erledigt wer- man verschiedene Zusammenstellun- den, angefangen von der Erstellung Die Eclipse-Plattform bietet zwei gen dieser Erweiterungen herunterla- und Änderung von Tabellen, Views grundsätzliche Möglichkeiten zur An- den. Neben den von der Eclipse Foun- oder Prozeduren über die Darstellung wendungserstellung. Entweder kann dation selbst angebotenen Plugins gibt von Explain-Plänen oder Daten (ein- man ein Plugin in die zum Teil aus es eine große Anzahl durch Drittanbie- schließlich Änderungen oder einfacher mehr als tausend weiteren Erweiterun- ter bereitgestellter Erweiterungen (sie- Filterung) bis hin zu einem komfortab- gen bestehende Eclipse-Entwicklungs- he http://eclipse-plugins.2y.net). len PL/SQL-Editor. umgebung selbst laden oder in Form

Eclipse im Datenbank-Umfeld

Für Datenbanken existieren zwei Ar- ten von Eclipse Plugins: Erweiterun- gen zur Verwaltung und Entwicklung von Datenbanken sowie solche, die den Zugriff auf Datenbanken aus Java- Anwendungen heraus ermöglichen. Auf der einen Seite steht mit der Ec- lipse Data-Tools-Plattform (DTP) eine Umgebung für den Zugriff auf beliebi- ge SQL-Datenbanken zur Verfügung. Dies ermöglicht es, über die jeweili- gen JDBC-Treiber aus der Eclipse Ent- wicklungsumgebung heraus SQL zu entwickeln und gegen die Datenbank Abbildung 1: Eclipse Data-Tools-Plattform

34 | www.doag.org Sun & Java

Die Anwendung ausführen und erweitern

Zur Ausführung der RCP-Anwendung müssen die zugehörigen Plugins in der Equinox-Laufzeitumgebung registriert und gestartet werden. Dies kann über „Launch an Eclipse Application“ auf der Übersichtsseite des in Abbildung 2 gezeigten Plugin-Editors erfolgen. Dabei entsteht automatisch eine Aus- führungskonfiguration, die neben dem eigenen „Testplugin“ automatisch die von diesem Plugin in der Manifest.mf definierten abhängigen Erweiterungen enthält. Inklusive geschachtelter Ab- hängigkeiten besteht so selbst die mi- Abbildung 2: Plugin-Editor nimale HalloWelt-Anwendung bereits aus 45 Einzelkomponenten. Ausgehend von der HalloWelt-An- einer Eclipse-RCP-Anwendung eine ei- Die generierte Beispielanwendung be- wendung des vorigen Abschnitts wird genständige Anwendung mit einer ge- sitzt genau eine Perspektive (Perspecti- nun eine einfache Telefonbuch-An- nau definierten Menge an zu ladenden ve.java), welche von der einzigen View wendung implementiert. Diese besitzt Plugins implementieren. Der Aufbau (View.java) voll ausgefüllt wird. Diese mehrere Telefonbücher, wobei jedes der einzelnen Plugins unterscheidet View enthält zunächst eine einfache aus einer Menge von Personen besteht. sich in beiden Fällen nicht wesentlich Liste mit drei Elementen, die mit den Für jede Person können Attribute wie und auch in einer eigenständigen RCP- ebenfalls als Plugins bereitgestellten Ba- Name, E-Mail-Adresse und verschiede- Anwendung sind bestehende Eclipse- sistechnologien (JFace und SWT) imple- ne Telefonnummern gepflegt werden. Erweiterungen problemlos nutzbar. mentiert ist. Über den Eclipse-Erweite- Abbildung 3 zeigt die fertige Anwen- Zur Entwicklung eigener Eclipse-Plug- rungsmechanismus werden View und dung. ins bietet sich die Nutzung der „Eclipse Perspektive in der Datei plugin.xml, die for RCP/Plug-in Developers“-Variante man mit dem in Abbildung 2 gezeigten Die Programmierung an, die bereits alle nötigen Bestandtei- Editor einfach editieren kann, im Basis- le enthält. Plugin org.eclipse.ui registriert. Wie aus Der erste Schritt bei der Programmie- Der „Plug-in Project Wizard“ im Da- der Manifest-Beschreibung hervorgeht, rung der Anwendung besteht in der tei-Menü unterstützt die ersten Schritte hängt die Beispiel-RCP-Anwendung da- Implementierung eines Modells für zum eigenen Eclipse-Plugin. Er fragt zu- mit unter anderem von dieser Erweite- eine Telefonbuchsammlung „Phone- nächst Basisinformationen wie Name, rung ab. groups.java“, für ein einzelnes Telefon- Version und Laufzeitumgebung ab. Außerdem unterscheidet er zwischen RCP- und „reinen“ Plugin- Projekten und fragt, ob die Komponente zur gra- fischen Oberfläche beiträgt. Eine ein- fache grafische RCP-Anwendung lässt sich im letzten Schritt über die Vorla- ge „RCP Application with a view“ er- zeugen. Die grafische Oberfläche von auf Eclipse basierenden Anwendungen besteht aus einer oder mehreren Pers- pektiven, wobei jede Perspektive eine initiale Menge an „Views“ und deren Aufteilung auf der Oberfläche umfasst. Eine einzelne View unterstützt jeweils eine bestimmte Aufgabe. In der Ent- wicklungsumgebung sind beispiels- weise der Projekt-Explorer oder die Ei- genschaftenanzeige als Views realisiert. Abbildung 3: Fertige Telefonbuch-Anwendung

DOAG News Q2-2010 | 35 Sun & Java

buch „Phonegroup.java“ sowie für die sert-Anweisungen auszuführen. Dieser Beziehungen zwischen Entitäten Personen in diesen Telefonbüchern Weg bietet über den Aufruf beliebiger werden in Java meist über Referenzen „Person.java“. Die Klasse „Person“ be- SQL-Anweisungen oder PL/SQL-Pro- oder Behälter-Typen wie Felder, Listen sitzt dabei fünf String-Attribute für zeduren eine hohe Flexibilität und bei oder Mengen realisiert. Diese können ihre Eigenschaften (samt zugehöri- richtiger Verwendung eine hohe Per- in JPA mit den Annotationen „@One- ger get- und set-Methoden) sowie eine formance. Allerdings ist es oft mühsam, ToOne“ (für 1:1-Beziehungen), „@Ma- Variable vom Typ „Phonegroup“ zur die SQL-Anweisungen manuell zu er- nyToOne“ (n:1), „@OneToMany“ (1:n) Speicherung ihres „Besitzers“. Ein sol- stellen, ohne dabei SQL Injection oder oder „@ManyToMany“ (n:m) auf die ches Telefonbuch besteht wiederum anderen Angriffen ausgesetzt zu sein. Datenbank-Entsprechungen „Fremd- aus einer Liste von Personen sowie ei- Die SQL-Anweisungen werden dabei schlüssel-Beziehung“ oder „Join-Tabel- nem String, der den Namen des Tele- außerdem oft Datenbank-abhängig. le“ abgebildet werden. fonbuchs speichert. In der Klasse für Objektrelationale Abbildungen bie- die Telefonbuchsammlung sind meh- ten hingegen eine automatische Ab- Erweiterung des Telefonbuch- rere solcher Telefonbücher schließlich bildung zwischen Java-Objekten und Datenmodells in einer Liste zusammengefasst. Das relationalen Tabellen. Im Java-Umfeld komplette Datenmodell ist − wie alle hat sich dabei die Java-Persistence-API Um die Anwendung prinzipiell daten- anderen hier gezeigten Klassen − unter (JPA), die neuerdings in Version 2.0 bankfähig zu machen, sind zunächst den Downloads zu diesem Artikel zu vorliegt, als offizielle Brückentechno- einige vorbereitende Schritte notwen- finden. Dort liegt auch eine RCP-View, logie etabliert. Der Standard besitzt dig. Dazu müssen die Komponenten welche die Darstellung des Modells mehrere Implementierungen, darun- „javax.persistence“ und „org.eclipse. übernimmt und die generierte Bei- ter , Apache OpenJPA oder persistence.*“ in der Manifest.mf als spiel-View „View1.java“ ersetzt. Diese EclipseLink. Letzteres ging als Open- benötigte Plugins deklariert sein. Au- View ist mittels SWT und JFace reali- Source-Variante aus Oracle TopLink ßerdem muss der datenbankspezifi- siert. Eine solche grafische Oberfläche hervor und stellt auch die Referenz- sche JDBC-Treiber in den Klassenpfad lässt sich entweder direkt von Hand in Implementierung von JPA 2.0 dar. Der aufgenommen werden (beispielsweise Java oder komfortabler mithilfe eines nächste Abschnitt geht auf JPA genau- ojbdc6.jar). Zur Erweiterung des Da- GUI-Designers wie dem kommerziel- er ein. tenmodells kann anschließend die len SWT-Designer oder (mit einigen Klasse „Person“ mit der Annotation „@ Abstrichen) über die Open-Source-An- Java-Persistence-API Entity“ versehen und dort ein Id-Feld wendung Eclipse Visual Editor (VE) im- für den Primärschlüssel hinzugefügt plementieren. In der View wird mittels Zentraler Punkt der JPA-Spezifikati- werden: Eclipse-Databinding das Datenmodell on sind sogenannte „Entitäten“. Die- an die grafische Darstellung gebun- se kennzeichnen eine spezielle Form @Id @GeneratedValue private den. Änderungen an der grafischen von Klassen, nämlich solche, die per- long id; Darstellung führen dabei unmittelbar sistente Instanzen besitzen können. zu Änderungen im zugrunde liegen- Eine Klasse wird als Entität deklariert, Dieselben Anpassungen sind auch den Datenmodell und umgekehrt. indem man sie mit der Annotation „@ für die Klasse „PhoneGroup“ durch- Entity“ markiert. Solche Klassen müs- zuführen. Dort ist zusätzlich die Lis- Datenbank-Zugriff sen einen parameterlosen Standard- te der Personen als „@PrivateOwned aus Java-Anwendungen Konstruktor besitzen und dürfen nicht @OneToMany(cascade=CascadeType. final sein. JPA verwendet an vielen ALL)“ zu kennzeichnen. Dadurch wird Die im vorigen Abschnitt beschriebe- Stellen das Prinzip „Configuration by die Beziehung über einen Fremdschlüs- ne Anwendung behält Telefonbücher exception“: Für viele Einstellungen sel in der Personen-Tabelle abgebildet. und Kontakte nur während eines Pro- sind Standardwerte voreingestellt, die Dank der Kaskadierung führt das Ent- grammlaufs im Arbeitsspeicher. Beim bei Bedarf jedoch überschrieben wer- fernen oder Hinzufügen einer Person Beenden der Anwendung gehen die den können. So führt obige „@Entity“- zu dieser Liste automatisch zur Persis- Daten verloren. Im Folgenden werden Annotation automatisch zu einer Ab- tierung beziehungsweise Löschung der nun die Telefonbücher samt der Kon- bildung der Klasse auf eine Tabelle entsprechenden Person im EntityMa- takte in einer relationalen Datenbank gleichen Namens, wobei die primiti- nager. Auch das erweiterte Datenmo- gespeichert. ven Eigenschaften auf gleichnamige dell kann wieder bei den Downloads Für den Zugriff einer Java-Anwen- Spalten in der Tabelle abgebildet sind. gefunden werden. dung auf eine Datenbank existieren Über die Annotationen „@Table“ und verschiedene Möglichkeiten: Ein be- „@Column“ lässt sich dieses Verhal- Lebenszyklus und Auffinden kannter Weg ist es, über JDBC eine di- ten jedoch auch manuell beeinflussen. von Entitäten rekte Verbindung zur Datenbank her- Eine Sonderrolle spielt eine mit „@Id“ zustellen und über diese Verbindung versehene Eigenschaft, die als Primär- Ein sogenannter „EntityManager“ ver- übliche SQL-Select-, Update- und In- schlüssel abgebildet wird. waltet Entitäten in JPA. Über diesen

36 | www.doag.org Sun & Java

liefert natürlich noch kein Ergebnis. Erfasst man diese jedoch in der An- wendung und speichert sie anschlie- ßend, so stehen die Daten auch bei zu- künftigen Anwendungsstarts oder für andere Benutzer zur Verfügung.

Erweiterte Anwendungsszenarien

Der komponentenorientierte Ansatz der Eclipse-Laufzeitumgebung ermög- licht eine gute Modularisierung von Anwendungen. Es hat sich dabei be- währt, die Datenbank-Zugriffsschicht Abbildung 4: Lebenszyklus einer Entität als eigenständiges Plugin unter Zuhilfe- nahme von EclipseLink zu realisieren. Ein Anwendungsbeispiel ist die Im- werden Entitäten gefunden, gespei- eine Liste verwaltet, folgendermaßen plementierung der Eclipse-RCP-An- chert oder gelöscht. Abbildung 4 zeigt angepasst werden: wendung „Horus Business Modeler“. den Lebenszyklus einer Entität. Horus ist eine frei verfügbare Model- Wird eine als Entität markierte Klas- • Im Konstruktor der Klasse werden lierungs- und Simulations-Software, se ganz normal über ihren Konstruktor der JDBC-Treiber registriert und eine die in einem Unternehmen oder einer erstellt, so befindet sie sich zunächst EntityManagerFactory für den Per- vernetzten Business Community das im Status „new“. Erst durch Aufruf der sistenz-Kontext erstellt. Unter an- verfügbare Organisationswissen nutz- persist-Methode des EntityManagers derem ist dabei festgelegt, wo und bar macht und Geschäftsprozesse ab- wird die Klasse zu einer verwalteten En- mit welchen Benutzerdaten die Da- bildet (http://www.horus.biz). Bei der tität, die dann auch in der Datenbank tenbank zu erreichen ist. Diese Para- Implementierung ist es möglich, das gespeichert ist. Bestehende Entitäten meter können auch bereits statisch für den Datenbank-Zugriff zuständi- kann man über die Methode „find“ in der persistence.xml gesetzt sein. ge Plugin (ohne es neu zu übersetzen) des EntityManagers anhand ihres Pri- Anschließend können auf der Fab- sowohl direkt in der RCP-Anwendung märschlüssels finden. Mit der Java Per- rik ein neuer EntityManager erstellt für den lokalen Datenbankzugriff als sistence Query Language (JPQL) kön- und eine neue Transaktion gestartet auch − über die serverseitigen Eclipse- nen auch komplexere Abfragen gestellt werden. Über die einfache Anfrage Komponenten − auf einem Server zu werden − die Syntax orientiert sich da- „select pg from PhoneGroup pg“ verwenden. bei an SQL. wird anschließend die Liste aller Te- Ein EntityManager stellt dabei eine lefonbücher abgerufen. Diese Liste Fazit Art Datenbank-Sitzung dar. Über ihn kann man direkt der bereits früher kann man auch einen transaktionalen implementierten lokalen Liste der Insgesamt ermöglicht der kompo- Kontext aufbauen. Zur Erstellung eines Klasse zuweisen. nentenorientierte Ansatz der Eclipse- EntityManagers dient die EntityMana- • Die Methoden „addGroup“ und „re- Plattform eine agile und verteilte Ent- gerFactory. Diese existiert genau ein- moveGroup“, die ein neues Telefon- wicklung großer Rich-Client-Anwen- mal pro Persistenz-Kontext und besitzt buch hinzufügen beziehungsweise dungen. Über die freie JPA-2.0-Refe- unter anderem einen Verbindungspool löschen, sind um einen persist- bzw. renzimplementierung EclipseLink ist zur Datenbank sowie einen gemeinsa- remove-Aufruf mit dem entspre- es mit moderatem Aufwand möglich, men Cache. chenden Telefonbuch auf dem En- objektorientierte Datenmodelle in ei- tityManager zu ergänzen. ner relationalen Datenbank zu spei- Fertigstellung der Demo-Anwendung • Schließlich muss man eine Metho- chern. Dabei kann von vielen sinnvol- de „save“ implementieren (samt zu- len Voreinstellungen profitiert werden Für die Telefonbuch-Anwendung muss gehörigem Button auf der GUI), die − von Caching über Standard-Tabel- man zunächst unter src/META-INF/per- die bisherige Transaktion des Entity- lennamen bis hin zur Abbildung von sistence.xml einen Persistenz-Kontext Managers abschließt (commit) und Attributen auf Tabellenspalten. definieren. Dieser besitzt einen ein- eine neue startet (begin). deutigen Namen und enthält eine Lis- te seiner Entitäten (Person und Phone- Beim ersten Start der Anwendung wer- Group). Anschließend muss die Klasse den automatisch die entsprechenden Kontakt: „PhoneGroups“, die in der ursprüngli- Datenbank-Tabellen generiert. Die Ab- Johannes Michler chen Version alle Telefonbücher über frage nach existierenden Datensätzen [email protected]

DOAG News Q2-2010 | 37