GenerateModel

Aus iDempiere de
Zur Navigation springen Zur Suche springen

GenerateModel ist ein Tool, das es erlaubt, zu einer neuen oder angepassten Tabelle in der Datenbank eine entsprechende Klasse im Java-Modell zu generieren.


Wie erzeugt man ein eigenes Datenmodell als Java-Code?

Um das zu erklären, hole ich ein wenig aus: In iDempiere sind alle Tabellen zuerst einmal über das Application Dictionary (AD) definiert. Das bedeutet, das man sie als Benutzer des System-Clients im Fenster Tabellen & Spalten definiert. Zuerst mal muss man darauf achten, das diese Definition auch die Tabellenstruktur in der Datenbank wiederspiegelt. Dazu kann man einerseits den Knopf "Create Columns From DB" im Tab "Table" benutzen, der aus einer Datenbank-Tabelle neue Einträge im AD erzeugt und andererseits den Knopf "Synchronize Column" im Tab "Column", der genau umgekehrt aus einem AD-Eintrag eine neue Spalte in der Datenbank erzeugt.

Eigentlich würde das schon reichen. Dennoch gibt es verschiedene Gründe, das man auf eine Tabelle auch aus dem Java-Code heraus zugreifen will. Hierzu gibt es eine standardisierte Form, wie solch ein Datenmodell in Java auszusehen hat. Alle persistenten Objektklassen sind von der Klasse org.compiere.model.PO abgeleitet. Für die einfachsten Fälle kann man Objekte jeder Klasse (also Datensätze jeder Tabelle) als PO-Objekte laden und bearbeiten. Für einen ordentlichen typisierten Zugriff benötigt man allerdings etwas mehr. Hierzu wird zu einer Tabelle BlaBla ein Interface I_BlaBla sowie eine Basis-Implementierung der getter und setter X_BlaBla verlangt. Wer nun besondere Geschäftslogik in seiner Klasse braucht, kann neben diesen standardisierten Zugriffsklassen die Klasse X_BlaBla ableiten in einer selbstgeschriebenen Klasse MBlaBla. Das ist sozusagen der eigene Teil vom Datenmodell. Alle Methoden innerhalb des Codes, die ein Objekt einer bestimmten Tabellenklasse erzeugen, rufen dann automatisch das eigene Modell auf. Auf den ersten Blick hört sich das kompliziert an. Das ändert sich allerdings, wenn man erfährt, das die I_* und X_*-Quelltexte automatisch erzeugt werden können. Denn obwohl die ganze Struktur sauber objektorientiert ist und z.B. für jeden Zugriff eine getXXX() und setXXX()-Methode bietet, braucht man nur die Sachen selbst zu schreiben, die man wirklich anpassen will.

Um diese Quelltexte nun zu erzeugen, benutzt man das GenerateModel Tool.


Aufruf in Eclipse

Im iDempiere workspace gibt es eine fertige Run-Configuration hierfür. Man ruft im Menü "Run -> Run Configurations..." auf. Im Baum links unter "Eclipse Application" findet man den "model.generator". Den wählt man aus und startet ihn mit dem "Run" Button. (Wenn Eclipse Konfigurationen von OSGi Programmen sich beim alerersten Start über -zig nicht vorhandener Bundles beschweren, sollte man im Tab "Plugins" einmal auf "Add Required Plugins" und ggf. "Validate Plugins" drücken).

Die Parameter, die man früher noch über die Kommandozeile übergeben hatte, kann man nun in einem Fenster eingeben. Hierzu muss man erstens wissen, wo seine Klasse hingeschrieben werden muss. Eigene Klassen können anstatt im Package "org.compiere.model" auch woanders stehen und natürlich sollte auch das Sourceverzeichnis auf das eigene Verzeichnis zeigen, wenn man ein eigenes Plugin schreibt. Wie seine Klasse heisst, sollte jeder selber wissen. Ggf. hat man bei der Anlage der Tabelle im AD auch einen Entitytyp angegeben, dessen Kurzcode man auch kennen sollte (Fenster Entity Type). Für Tabellen, die zum vorinstallierten Teil des AD gehören, ist das z.B. "D". Wer einen eigenen Entity Typ hat, kann alsKalssenname "%" angeben.

Mehr Infos gibt es auch in [meinem älteren Artikel].

Nun löst man das Programm aus. Danach sollte man seinen Workspace refreshen (auf das Projekt gehen und mit dem Kontextmenü "refresh"). Danach kann man seine nagelneuen Modeldateien ansehen.

Aufruf in ADempiere über die Kommandozeile

In ADempiere musste man das Tool noch auf der Kommandozeile aufrufen und einige Parameter übergeben. Zur Referenz gebe ich hier einige Links. Da es sich im Kern um das gleiche Programm handelt, sind diese vielleicht bei Problemen auch hilfreich.