Herzlich willkommen auf dem Blog der exensio GmbH

exensio ist ein unabhängiges Software-Unternehmen von erfahrenen IT Beratern und Architekten. Zu unseren Kunden zählen namhafte deutsche Großunternehmen.

exensio verbessert das Kommunikations- und Informationsmanagement von Unternehmen. Auf Basis sinnvoller und zweckmäßiger Technologien erarbeiten wir flexible und übergreifende Lösungen für webbasierte Informationssysteme. Abhängig von den Kundenanforderungen realisieren wir Web Applikationen sowie Lösungen auf Basis von Web Content Management- und Portalsystemen. Integrativ, wirtschaftlich und anwenderfreundlich!

Hier gelangen Sie zur exensio GmbH.

Montag, 17. Januar 2011

Domain-Modellierung in GORM, Tipps/ BestPractices

Grails Domain Klassen sind Grundbausteine und enthalten die Datenstrukturen und Zuständen einer Geschäftsanwendung.
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.

    Erläuterung der einzelnen Punkten: 
    1. DB-Präfix der Applikation, siehe auch Punkt-7
    2. Eine abstrakte Basisklasse, die das Interface Serializalbe implementiert
    3. Automatisches Timestamping, per Namenskonvention aktualisiert GORM die zwei Attribute("dateCreated" und "lastUpdated") bei entsprechenden Ereignissen
    4. Automatisches Timestamping, siehe auch Punkt-3
    5. Das "Version" Attribut( ähnlich wie bei der JPA Annotation: @Version), das von GORM zum "Optimistischen Locking" verwendet wird
    6. Eine Grails Domain Klasse, durch die Vererbung verfügt es über alle Eigenschaften seiner Basisklasse
    7. 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.
    8. Name der DB-Sequenz "MYAPP_PROJECT_ID_SEQ". Diese hat die gleiche Funktion wie der Tabellename von Punkt-7
    9. Defaultmäßige Sortierung nach "Title" in einer List von Projekten
    10. Defaultmäßige String-Repräsentation für ein Objekt der Domain Klasse.

    Keine Kommentare:

    Kommentar veröffentlichen