| 

.NET C# Java Javascript Exception

Konstanten in Domain-Klassen definieren

Dies ist das Archiv des ehemaligen Forums zum Thema Groovy, Grails, Griffon und Bean Scripting Framework, welches unter groovy-forum.de existierte. Die neue Adresse des Groovy-Forums ist: http://codekicker.de/fragen/themen/groovy.


Konstanten in Domain-Klassen definieren

slyfox1972 - 09.12.2010 10:46
Hallo!

Ich habe in Domain-Klassen Konstanten (typ static final byte) definiert.

class Author {

	static final byte STATUS_REDAKTEUR = 1
	static final byte STATUS_MAGAZINE_ADMIN = 2
	static final byte STATUS_SITE_ADMIN = 3

	byte status
...

}

Nun verwende ich das Plugin "classDiagram" zum Anzeigen des Klassenmodells, das ich für die Dokumentation verwenden will.
Nun werden da für diese Konstanten unsinnigerweise auch get-Methoden definiert und im Diagramm angezeigt:

- byte getSTATUS_REDAKTEUR()
- byte getSTATUS_MAGAZINE_ADMIN()
- byte getSTATUS_SITE_ADMIN()

Kann ich diese Konstanten irgendwie anders definieren, dass diese Methoden nicht im Diagramm auftauchen?

Gruß

Egon Schmid


Re: Konstanten in Domain-Klassen definieren

christian - 09.12.2010 15:10
Du könntest statt Integer-Konstanten auch enums verwenden.

Gruß
Christian


Re: Konstanten in Domain-Klassen definieren

slyfox1972 - 09.12.2010 20:45
Daran hab ich auch gedacht...

nun ja, mit etwas viel Googeln hab ich rausgefunden, wie man enum's in Grails verwendet, denn auf grails.org gibt's keine vernünftige Dokumentation/Beispiele dazu:

Meine Lösung:

Unter grails-app/domain eine .groovy-Datei für das enum anlegen.

In meinem Fall:

enum AuthorStatus {
	NONE(0), REDAKTEUR(1), MAGAZINE_ADMIN(2), SITE_ADMIN(3)
	Integer id;
	AuthorStatus(Integer id) {
		this.id=id;
	}
}

Bei der Klasse, welche die enum-Eigenschaft verwendet, diese nicht als

AuthorStatus status

definieren, sondern wie folgt:

Integer status

static mapping = {
	status sqlType: 'int(3)' // sqlType nach Bedarf ändern
}

static constraints = {
	status inList: AuthorStatus.values()*.id
}

(sonst wird varchar(255) als DB-Feld dafür genommen... Warum eigentlich nicht gleich longblob? -.- )

In Grails lassen sich viele Dinge, die eigentlich einfach klingen, nur äusserst kompliziert lösen.

Da fallen mir z.B. ein:
- Einen Fremdschlüssel für ein Feld definieren, der nicht vom Typ Long ist...
- einen anderen Konstruktor für eine Domain-Klasse definieren

Grüße

Egon Schmid


Re: Konstanten in Domain-Klassen definieren

christian - 09.12.2010 21:50
> In Grails lassen sich viele Dinge, die eigentlich
> einfach klingen, nur äusserst kompliziert lösen.
>
> Da fallen mir z.B. ein:
> - Einen Fremdschlüssel für ein Feld definieren,
> der nicht vom Typ Long ist...
> - einen anderen Konstruktor für eine Domain-Klasse
> definieren

Das ist mir auch schon aufgefallen! Ich halte GORM für ein echtes Hindernis; JPA ist auch nicht schwieriger, aber wesentlich besser. Nur leider ist Graeme Rocher wohl zu stolz auf GORM um es endlich durch JPA zu ersetzen (und es soll mir jetzt niemand erzählen, dass es auch ein JPA-Plugin gibt!).

Gruß
Christian


Re: Konstanten in Domain-Klassen definieren

mpuhlmann - 10.12.2010 12:37
Hallo Egon,

bzgl. des Enums verstehe ich nicht, welches Problem bei der Generierung der Column als varchar(255) besteht. Letztlich wird in der Tabellenspalte der textuelle Name des Enum-Wertes hinterlegt (also z.B. "REDAKTEUR"). Dies hat aus meiner Sicht folgende Vorteile:

1.) Wenn man mal direkt in die DB schaut, sind die Werte direkt ersichtlich.
2.) Sollten neue Enum Werte hinzukommen, muss nicht darauf geachtet werden, dass sie an die richtige Stelle (nämlich ans Ende) der Enum Definition gepackt werden.

Wenn man allerdings den Wert als Integer ablegen will, so kann dies relativ leicht konfiguriert werden (analog JPA Annotation @EnumType). Für dein Beispiel würde es etwa so aussehen:

static mappings = {
...
   status enumType: 'ordinal'
...
}

Hier wird dann der Integer Wert (bezeichnet die Position in der Enum-Definition beginnend mit 0) des Enum-Werts in der DB abgelegt.

Gruss

Marco


Re: Konstanten in Domain-Klassen definieren

saurier - 10.12.2010 13:48
Hallo Egon,

in früheren Versionen von Grails wurden enums auf 'int' gemapped. Ab 1.1 wurde das auf
Strings umgestellt - sicher aus gutem Grund. Das hat aber wohl einige verwirrt und die
Folgen dieser Verwirrung findet man jetzt auf Google.

Das hier sollte funktionieren:
enum AuthorStatus {
	NONE, REDAKTEUR, MAGAZINE_ADMIN, SITE_ADMIN
	final int value
	static mapping =
     { value("enumType": "ordinal") } // int statt String benutzen
}
und benutzen einfach mit
AuthorStatus status

Aber wie Marco schon geschrieben hat, es hat durchaus Vorteile Strings zu benutzen.

Gruß,
Christian


Stelle deine Groovy-Frage jetzt!


Diese Seite zeigt den Thread "Konstanten in Domain-Klassen definieren" der ehemaligen Webseite groovy-forum.de, welche durch einen Serverunfall zerstört wurde. codekicker.de hat viele Konversationen über die beliebte Programmiersprache Groovy und zugehörige Frameworks wie das Grails-Framework retten können.

Hast Du eine Frage zum Thema Groovy, Grails oder allgemein Java? Viele ehemalige groovy-forum.de Mitglieder beantworten dir auf codekicker.de deine Frage! Stelle jetzt eine Frage!

Viele weitere Diskussionen zu Grails und Groovy befinden sich auf der Threadübersicht des alten groovy-forum.de.