Die Domain-Modellierung ist ein wichtiger Bestandteil des Grails Object Relational Mappings (GORM).
In den vergangenen Grails Projekten, die in der Produktionsumgebung eine Oracle-Datenbank benutzen, finden einige Arbeitschritten zur Domain-Modellierung in derselben Art regelmäßig wiederkehrend statt.
Diese routinemäßigen Schritte möchte ich nun anhand eines Beispiels beschreiben:
package com.exensio.myapp.helper;
public class Constants {
public static final String DB_PREFIX = "MYAPP_"; // 1
}
abstract class AbstractEntity implements Serializable { // 2
Date dateCreated // 3
Date lastUpdated // 4
Integer version // 5
}
class Project extends AbstractEntity { // 6
String title
static mapping = {
table Constants.DB_PREFIX + "project" // 7
id generator: "native", params:[ sequence: Constants.DB_PREFIX + "project_id_seq" ] // 8
sort "title" // 9
}
String toString() { title } // 10
}
Tabellen-/Sequenzen- Namen bei dem DB-Mapping
Aus folgenden Gründen wird in dem obigen Beispiel (Punkten-1,7,8) ein DB-Präfix verwendet:
- Wie die meisten Datenbank-Systeme hat Oracle vordefinierte Schlüsselwörter, die nicht als Tabellen-/Sequenz- Namen verwendet werden dürfen. Mit einem Präfix kann dies Problem vermieden werden.
- Das Präfix ermöglicht die Verwendung eines gemeinsamen DB-Schemas mit weiteren Applikationen.
Automatisches Timestamping
Die Idee ist, automatisch einen Zeitstempel bei einer schreibenden DB-Operation zu setzen. Technisch wird dies mittels zwei GORM-Events: "beforeInsert" und "beforeUpdate" realisiert.
Als Grails-Entwickler hat man hier Glück, da mann den Konventionen folgen kann und zwei Attributen (wie Punkte-3,4 im Beispiel) definiert.
- DB-Präfix der Applikation, siehe auch Punkt-7
- Eine abstrakte Basisklasse, die das Interface Serializalbe implementiert
- Automatisches Timestamping, per Namenskonvention aktualisiert GORM die zwei Attribute("dateCreated" und "lastUpdated") bei entsprechenden Ereignissen
- Automatisches Timestamping, siehe auch Punkt-3
- Das "Version" Attribut( ähnlich wie bei der JPA Annotation: @Version), das von GORM zum "Optimistischen Locking" verwendet wird
- Eine Grails Domain Klasse, durch die Vererbung verfügt es über alle Eigenschaften seiner Basisklasse
- Name der DB-Tabelle "MYAPP_PROJECT". Dieses Verfahren ermöglicht zum einen die Verwendung eines gemeinsamen DB-Schemas mit weiteren Applikationen, zum anderen wird hierdurch vermieden, dass ein von der Datenbank reserviertes Schlüsselwort als Tabellenname verwendet wird.
- Name der DB-Sequenz "MYAPP_PROJECT_ID_SEQ". Diese hat die gleiche Funktion wie der Tabellename von Punkt-7
- Defaultmäßige Sortierung nach "Title" in einer List von Projekten
- Defaultmäßige String-Repräsentation für ein Objekt der Domain Klasse.
Keine Kommentare:
Kommentar veröffentlichen