Eclipse RCP – Datenbank Viewer mit Swing, JPA

Freitag, 30. November 2012 von  
unter Fachartikel Architektur

Die Motivation

In diesem fünften Blog-Eintrag zum Thema Eclipse RCP (“Rich Client Platform“) Applikationen möchte ich erklären, wie man mit Eclipse RCP PlugIns Applikationen mittels Swing und JPA durch Nutzung der in den Entwicklungsumgebungen NetBeans und Eclipse vorhandenen Wizards und Generatoren relativ leicht Datenbank Viewer Dialoge generieren und wiederverwenden kann. Wie leicht man Swing-Anwendungen zu Eclipse RCP PlugIns Applikationen migrieren kann, wurde bereits im ersten Blog-Eintrag dieser Reihe hier erklärt. Für JPA als Standard für die Datenbank-Anbindung beliebiger Apps gibt es vielfältige Unterstützung durch Eclipse PlugIns und Ant Task-basierende Wizards. Hierzu sollen Swing GUIs generiert werden, wofür innerhalb der NetBeans IDE (“Integrated Development Environment“) die Unterstützung für Swing Desktop Applikationen durch entsprechende Wizards genutzt werden soll. Über die Eclipse RCP PlugIns Projekt-Wizards werden die generierten Komponenten nach einem leichten Refactoring dann zusammen als Eclipse RCP PlugIns App veröffentlicht. Klingt doch nach einem Heimspiel, also los geht’s.

Die Grundlagen

Die Grundlagen Eclipse-basierter Produkte wurden bereits im ersten Eclipse RCP Blog-Eintrag hier besprochen. Was die Grundlagen und zu beachtenden JPA-Features angeht, existieren dazu in diesem Blog bereits mehrere Artikel bzw. Blog-Einträge, z.B. hier, hier, hier, und hier, weshalb hier nur auf das sehr gute “Pro JPA 2“-Buch aus dem apress-Verlag verwiesen werden soll, dies natürlich nur für den Fall, dass nach der Lektüre der vorhandenen Blog-Einträge noch Fragen offen bleiben. Bekanntlich benötigen die Swing GUI Applikationen als Standalone Apps keinen J(2)EE – Applikations-Server (wie GlassFish, JBoss, Tomcat, WebSphere, etc.) und verwenden keine EJBs im Sinne von Stateless/Stateful Session Beans (SLSB/SFSB) oder Message-Driven Beans (MDB), sondern verwenden Datenbank Connections und Transactions auf Basis von RESOURCE_LOCAL-EntityTransactions des EntityManagers. Für die generierte und refaktorisierte Eclipse RCP PlugIns-Applikation soll dieser Transaktionstyp genügen und ist auch in den meisten Praxis-Fällen passend, nicht nur beim Einsatz asynchronen Batch Processings.

Die Beispiel App als Eclipse RCP PlugIn entwickeln

Die Datenbank generieren, selbst anlegen, oder exportieren:

Hier das mittels Eclipse-PlugIn Umlet erstellte UML-Diagramm der Entities und  Datenbank-Objekte:
 

Um die benötigten Persistenz-Klassen der Beispiel-Applikation zu erzeugen, gibt es, unterstützt durch verschiedene IDEs und PlugIns, bekanntlich mehrere Möglichkeiten. Entweder man nutzt JPA bzw. Hibernate (als JPA-Implementierung) oder nutzt unterstützende graphische Tools/Wizards (wie z.B. die Eclipse-Hibernate/JPA-Tools) und lässt sich das Datenbank-Schema aus den annotierten Entities mit der HibernateHelper-Klasse generieren. Oder man trägt „Create“ in der hibernate.cfg.xml-Datei bzw. der persistence.xml ein und lässt sich das Datenbank-Schema mit Hilfe des Hibernate-Treibers aus den vorhandenen JPA-Entities beim ersten Start der Applikation generieren.

Wem das alles „too much“ ist, wer sich aber mit dem Datenbank-System seiner Wahl auskennt und fließend SQL bzw. DDL-Skript spricht, kann als „Reverse Engineering“ die Datenbank-Tabellen Definitionen einfach runterscheiben bzw. mit einem Tool seiner Wahl (z.B. phpMySQLAdmin) aus einer bereits vorhandenen Datenbank exportieren (und erforderlichenfalls adaptieren), und auf einem Testsystem durch Einspielen der DDL-Skripte die neue Datenbank erzeugen und sich danach die JPA-Entities aus den Datenbank-Tabellen in Eclipse mittels Klick-Pfad “New/Other/JPA/JPA Entites from Tables“ generieren. Hierfür bieten sowohl Eclipse als auch NetBeans optimale Unterstützung an.

Hier noch beispielhaft die annotierten Entities für die Oracle Datenbank. Daraus wurde mit dem HibernateHelper (hier) das folgende DDL-Skript generiert. Beim Einspielen in eine MySQL oder Derby-DB und dem Ignorieren der Error-Messages wurden prinzipiell die folgenden MySQL-Tabellen angelegt, die man natürlich noch modifizieren und nachbearbeiten kann. Hier die resultierenden DDL-Skripte.

Die folgenden Indizes und Foreign Key Constraints wurden (für EAGER-Fetching) in der MySQL hier beispielhaft angelegt. Weitere Indizees können zur Übung angelegt werden, obwohl die nun folgenden Datenbank-Viewer, die mit NetBeans und Eclipse zu einer Eclipse RCP-Anwendung generiert werden, reine 1-zu-1 Sichten der Datenbank-Tabellen sind, ohne alle verbundenen Tabellen automatisch mitzuladen. Aus demselben Grund wurde auch auf die dynamischen n:m Tabellen (cc_customers_matching, cc_customers_search) und weitere Cross-Referenzen in der Datenbank verzichtet, sie werden für die Beispiel App einfach nicht benötigt.

Wenn daraus (z.B. mit NetBeans oder Eclipse) die JPA-Entities generiert werden, sehen diese Entities bedingt durch den verwendeten Treiber eher MySQL-typisch aus, hier das Beispiel-Paket mit den MySQL JPA-Entities. In den zu generierenden Swing Datenbank-Viewern sollen diese MySQL-Entities prinzipiell Verwendung finden. Beim Annotieren der JPA-Entities sind allerdings die verschiedenen Datenbank DDL-Dialekte mit den evtl. unterstützten Defaults zu beachten. Deshalb hier der folgende beispielhafte Vergleich zur Definition der autoinkrementellen technischen Primary Key Id-Column einer Datenbank-Tabelle und eines Entity @Id Attributs.

Die Swing Datenbank-Viewer (Desktop Apps mit Swing User Interfaces) generieren:

Hier der Klick-Pfad in der NetBeans IDE zum Generieren einer Swing Desktop Datenbank-Viewer App:

New Project/Java/Java Desktop Application/Next/Next/Database Application (Project Name) „CareerCommunityBusinessInterest“/Next/Database Connection/New Database Connection/MySQL (Connector/JDriver)/ jdbc:mysql://localhost:3306/careercommunity/Ok/Database Table: cc_business_interest/Next/Textfields/Finish.

Dadurch wird z.B. der Swing Desktop App Datenbank Viewer für die Tabelle cc_business_interest generiert, der standalone z.B. über die statische main-Methode der CareerCommunityBusinessInterestApp.class gestartet werden kann.

Analog wird mit den weiteren Datenbank-Tabellen verfahren, für die je Tabelle bzw. je Entity („TablePerClass“-Pattern) ein Datenbank Viewer erforderlich ist.

Hier die Beispiel-Projekte, den jeweiligen Tabellen der CareerCommunity App zugeordnet:

cc_business_interest
cc_hobby
cc_personal_info
cc_profession
cc_contact_channel
cc_group
cc_regular_customer
cc_contact
cc_premium_customer
cc_regular_customer_group

Eclipse RCP PlugIns-Projekt anlegen und konfigurieren:

Auch für das Anlegen des Eclipse PlugIns-Projekts wird auf den bereits erwähnten Blog-Eintrag hier verwiesen. Mit dem NetBeans-Kontext-Menü auf dem jeweiligen Projekt wird mittels „Clean and Build“ das jeweilige .jar erzeugt, welches danach in ein bestimmtes libs-Verzeichnis kopiert wird, um diese .jar-Dateien dem Build Path eines Eclipse PlugIns-Projekt als JARs (import Filesystem) hinzuzufügen. Die zweite Möglichkeit ist, die wenigen Klassen je Datenbank Tabellen-Viewer einfach ins Eclipse RCP PlugIn Projekt in ein jeweils eigenes Package zu übernehmen, was in der Beispiel-Applikation, die hier zu finden ist, der Einfachheit wegen durchgeführt wurde.

Das Erstellen eines Elipse PlugIns-Projekts wurde auch bereits im ersten Blog-Eintrag der Eclipse RCP-Reihe in diesem Blog beschrieben, weshalb hierfür genauso vorgegangen wird. Als Datenbank wurde für dieses Beispiel MySQL 5.1. InnoDB verwendet, zusätztlich bietet NetBeans über TopLink Unterstützung durch die Oracle-Treiber, die ebenfalls genutzt werden kann. Deshalb sollten aus den generierten NetBeans-Desktop Datenbank Viewer Apps ebenso die folgenden Datenbank-Treiber und Swing-Pakete dem Build Path des Eclipse RCP PlugIns-Projekt hinzugefügt werden:

– appframework-1.0.3.jar
– swing-worker-1.1.jar
– beansbinding-1.2.1.jar
– toplink-essentials-agent.jar
– toplink-essentials.jar
– mysql-connector-java-5.1.6-bin.jar

Die Swing UIs (User Interfaces) wurden je Datenbank Viewer in NetBeans ja bereits dazugeneriert und, wie bereits beschrieben, mittels plugin.xml-Datei, über den Bind des Aufrufs der jeweiligen App an ein <action>-Element in der XML-Konfigurationsdatei mit Hilfe der SampleAction als ActionProxy in der Eclipse RCP PlugIns App aufrufbar. Deshalb hier beispielhaft eine App-Klasse mit der zu implementierenden run()-Methode, welche aus den mittels NetBeans generierten Swing Datenbank Viewer-Klassen über den Extension Point innerhalb der plugin.xml aufgerufen wird. Hier auch die resultierende plugin.xml.

Um das Swing User Interface zu editieren und weiterzuentwickeln, kann das Open Source Eclipse PlugIn “Jigloo“ verwendet werden, welches hier kostenfrei zum Download bereit steht: http://www.heise.de/download/jigloo-1147626.html

Die Möglichkeit, ansprechende Swing GUIs zu entwickeln, bietet natürlich auch die NetBeans IDE, die über den Klick-Pfad Window/Palette oder beim Doppelklicken einer von der Swing-Klasse FrameView abgeleiteten Klasse in die Design View mit den Swing GUI Elementen wechselt, um hier die gewünschten Dialoge weiterentwickeln und refaktorisieren zu können:

Hier noch das Beispiel der Eclipse RCP PlugIns Swing-Applikationen mit der JPA-Anbindung, was natürlich als Open Source Applikation zur Anlage und Weiterverarbeitung von CareerCommunity Datenbank-Objekten wiederverwendet und weiter refaktorisiert und verwendet werden kann und als Persistenz-Framework TopLink verwendet.

Fazit: Generatoren machen Spaß, können als Open Source kostenfrei genutzt werden und führen auch innerhalb begrenzter Zeit zu erfreulichen, produktiven Ergebnissen. Sie sind also fürs RAD (Rapid Application Development) und RPT (Rapid Prototyping) bestens geeignet. Den generierten Code kann man natürlich auch weiter refaktorisieren und weiterverwenden.

Eine schöne Übung wäre sicherlich noch, die generierten Swing Datenbank Viewer als einzelne Eclipse PlugIns ohne Rich Client View anzulegen und zu exportieren, danach dann diese Non-GUI Eclipse PlugIns dem Eclipse RCP PlugIns-Projekt mit dem Hauptdialog als PlugIn-Dependencies deklarativ bekannt zu machen.

Alle Uploads dieses Blog-Eintrags befinden sich hier.

Weiterhin viel Freude mit dem Einsatz generativer, generischer Tools, Frameworks und (Eclipse) PlugIns.

Allen interessierten Leserinnen und Lesern noch eine besinnliche vorweihnachtliche Zeit und ein fröhliches Weihnachtsfest.

Kommentare

3 Kommentare zu “Eclipse RCP – Datenbank Viewer mit Swing, JPA”

  1. Von Services – REST, Hibernate, JSF mit JBoss 7 : binaris informatik GmbH am Sonntag, 27. Oktober 2013 19:20

    […] Unter src/main legt man nun im Package de.binaris.service.model.entity mit File/New/Seam Entity/… die JPA Entities an (für Bspl. siehe auch den Blog-Eintrag über Datenbankviewer mit Swing). […]

  2. Von Services – mit Hibernate 4, Vaadin 6, JBoss 7 : binaris informatik GmbH am Samstag, 15. März 2014 11:51

    […] zur Generierung und Erweiterung der benötigten Entities wurde bereits in den Blog-Einträgen hier und hier genauer […]

  3. Von Services – TDD mit QF Test, Java, JDK, Eclipse RCP : Softwareentwicklung, Projektmanagement & Schulung | binaris informatik GmbH am Sonntag, 30. August 2015 20:32

    […] implementierte Java Desktop-Applikation wurde bereits einmal in diesem Blog-Eintrag hier und auch hier vorgestellt im Zusammenhang mit der Migration dieser Applikation zu einer Eclipse RCP Applikation […]

Einen Kommentar hinzufügen...

Sie müssen registriert und angemeldet sein um einen Kommentar zu schreiben.