| 

.NET C# Java Javascript Exception

Re: Domain class not found in grails-app/domain, trying hibernate mapped classes...

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.


Re: Domain class not found in grails-app/domain, trying hibernate mapped classes...

milkyman - 26.08.2010 10:47
Nach einer schlaflosen Nacht und gefühlten 500 generates habe ich jetzt den Grund für diese etwas seltsame Fehlermeldung gefunden.
Ich habe in der betreffenden Klasse u.a. die getId() überschrieben, weil ich einen Composite Key in der Domain habe.

Für Grails bis 1.1 war das ok und hat wunderbar funktioniert, jetzt mit 1.3 aber offensichtlich nicht mehr.

Bye,
Horst


Re: Domain class not found in grails-app/domain, trying hibernate mapped classes...

hump - 09.09.2010 15:08
verstehe ich das richtig, dass unter Verwendung deines Plugins bei der Verwendung von composite keys das scaffolding mit grails 1.3.4. funktioniert ?


Re: Domain class not found in grails-app/domain, trying hibernate mapped classes...

milkyman - 09.09.2010 16:47
Ist das eine Fangfrage? ;-)

Sagen wir mal so: Ich habe ja selber ein Projekt mit einem Composite Key, bestehend aus 3 Feldern. Die mit meinem Plugin generierten Views/Controller funktionieren damit. Man muss allerdings in der Domain zwei Methoden modifizieren: getComposite und getCompositeId (werden mit default Implementierung generiert). Unten ein Beispiel, wie ich es gelöst habe. Die generierten Controller/Views verwenden dann überall die getComposite* Methoden.

Falls du da einen konkreten Bedarf hast, probiers doch mal aus!

	static String getPersonFromId(String compositeId) {
		return compositeId.substring(0,compositeId.indexOf("-"));
	}
	static String getProjectFromId(String compositeId) {
		return compositeId.substring(compositeId.indexOf("-")+1,compositeId.lastIndexOf("-"));
	}
	static String getLevelFromId(String compositeId) {
		return compositeId.substring(compositeId.lastIndexOf("-")+1);
	}

	static UserRight getComposite(String compositeId) {
		return UserRight.get( 
        		new UserRight(
        			person:Person.get(UserRight.getPersonFromId(compositeId)), 
        			project:Project.get(UserRight.getProjectFromId(compositeId)), 
        			level:AccessLevel.get(UserRight.getLevelFromId(compositeId))
        		) 
        	);
	}

	String getCompositeId(){
		return person.id + "-" + project.id + "-" + level.id;
	}

Bye,
Horst


Re: Domain class not found in grails-app/domain, trying hibernate mapped classes...

hump - 09.09.2010 17:14
Danke für das Beispiel!

Bin gerade dabei das auszuprobieren (Habe mit GRAG einige Domains aus meiner legacy db erzeugt).
In deinem Domain-Template steht "implements Comparable", aber nach Start der App stand als Fehler, eine Domain mit composite-id muss "Serializable" sein.
Habe es jetzt mit "implements Comparable, Serializable" zum Laufen gekriegt.
 
class Station implements Comparable, Serializable {
    static belongsTo = [ Betreiber ]

    static mapping = {
        table 'STATIONEN'

        // version is set to false, because this isn't available by default for legacy databases
        version false
        
        // PK
        id composite:['betreiber', 'stationId'], generator:'assigned'

        // non-standard column names
        betreiber  column:'BETREIBER_CODE'
        stationId  column:'STATION_CODE'
        lageM5852 column:'LAGE_M5852'

        // default sort order
        sort betreiber:'asc', stationId:'asc'

    }
    Betreiber betreiber
    String stationId
    String kurzname
    String langname
    String beschreibung
    String html
    String ortsbezeichnung
    String standort
    String plzOrtStat
    String polBezirk
    String lageM5852
    java.math.BigDecimal geoLaenge
    java.math.BigDecimal geoBreite
    java.math.BigDecimal geoRechtswert
    java.math.BigDecimal geoHochwert
    java.math.BigDecimal seehoehe
    String stationAktiv
    java.math.BigDecimal zeitZone
    String kommentar1
    String kommentar2
    Date inbetriebnahme
    Date ausserbetriebnahme
    Date gueltigVon
    Date gueltigBis
    String euCode

    static constraints = {
        id(display:false, attributes:[listable:false]) // do not show id anywhere
        stationId(size: 1..4, blank: false)
        kurzname(size: 0..32)
        langname(size: 0..72)
        beschreibung(size: 0..2000)
        html(size: 0..132)
        ortsbezeichnung(size: 0..60)
        standort(size: 0..60)
        plzOrtStat(size: 0..60)
        polBezirk(size: 0..60)
        lageM5852(size: 0..60)
        geoLaenge(nullable: true, size: 0..22)
        geoBreite(nullable: true, size: 0..22)
        geoRechtswert(nullable: true, size: 0..22)
        geoHochwert(nullable: true, size: 0..22)
        seehoehe(nullable: true, scale: 2)
        stationAktiv(size: 0..1)
        zeitZone(nullable: true, scale: 1)
        kommentar1(size: 0..80)
        kommentar2(size: 0..80)
        inbetriebnahme(nullable: true)
        ausserbetriebnahme(nullable: true)
        gueltigVon(nullable: true)
        gueltigBis(nullable: true)
        euCode(size: 0..15)
    }

    String toString() {
        return "${betreiber.id} ${stationId} ${kurzname} ${langname}"
    }

    static transients = ['compositeId']


    static Station getComposite(String compositeId) {
        // change this only, if your domain class has a composite key
        println compositeId
        def betreiberid
        def stationId
        (betreiberid, stationId) = compositeId.tokenize('-')
        
        return Station.get(new Station(betreiber:Betreiber.get(betreiberid), stationId: stationId))
    }

    public String getCompositeId() {
        // change this only, if your domain class has a composite key
        return betreiber.id + '-' + stationId
    }

    public void deleteAndClearReferences() {

        // OPTIONAL TODO: add code if needed, to break references before deletion

        // and finally do what we really want
        this.delete(flush:true)
    }

    public int compareTo(Object o) {

        // TODO: change id to fitting order property
        return (id.compareTo(o.id))
    }
}

Werde es mir morgen noch genauer anschauen, ob alles klappt.


Re: Domain class not found in grails-app/domain, trying hibernate mapped classes...

milkyman - 13.09.2010 10:13
Hi.

Freut mich, dass dir meine Templates weiterhelfen konnten.

Und danke für dein Feedback! Nur durch solche Rückmeldungen können die Templates noch besser werden. Und durch Details wie dein
compositeId.tokenize('-')
merke ich wieder, wie wenig Groovy mein Source leider nach wie vor ist. Falls du noch mehr solcher Stellen gesehen hast, die man mit Groovy eleganter/kürzer lösen könnte, kannst du gerne Bescheid sagen. Den tokenize habe ich schonmal eingebaut.


Zu deinen Anmerkungen:
a) composite-Id mit Serializable: Ja richtig, der muss dann mit rein. Da zum Generierungszeitpunkt der Domain allerdings noch nicht bekannt ist, ob die einen composite-Id bekommen wird, kann ich das nicht generieren lassen. Ich habe aufgrund deines Hinweises aber einen Kommentar in die getCompositeId() reingeneriert, damit man direkt weiß, dass der Serializable notwendig ist.
b) id immer log: Stimmt auch. Bei mir war es bisher so und ich war mit unsicher, ob es andere Fälle gibt. Da es ihn gibt, habe ich das mal als Issue erfasst. Wird mit der nächsten Version korrigiert. Ich sammel derzeit noch ein paar TODOs.
c) constraint attribute filterable: Gute Idee, werde ich als Erweiterung einplanen, also später mal. Seidenn: Findest du es störend, dass ein Filter da ist, den du nicht brauchst?

Hat der Rest sonst komplett funktioniert? Gerade bei id als String hätte ich noch an der einen oder anderen Stelle Probleme erwartet.

Bye,
Horst


Re: Domain class not found in grails-app/domain, trying hibernate mapped classes...

hump - 13.09.2010 15:08
Einige Dinge sind mir mal schnell aufgefallen, die Probleme machen könnten:

Im List-View:
Kombination aus Filter und Sortieren - bei Sortieren einer Spalte geht die Filterung wieder verloren.
ein filterable:false wäre schon praktisch,weil sonst recht lange Auswahllisten enstehen könnten.
Sinnvoller scheint mir die Beschränkung auf ein Filterfeld, weil sonst bei Auswahl eines Filters eigentlich die Filterauswahl in den anderen Feldern aktualisiert werden müsste.

Im Edit/Create-View:
Lässt sich ein nullable Date nicht ohne Datum (NULL) eingeben.
Die id ist nicht sichtbar, auch wenn sie generator:'assigned' ist.

Im Edit-View bei 1:n Relationen wird ein default.associate.label angezeigt - was hat das für eine Funktion ? (siehe Screenshot)
bzw. wie kann man die Relation wieder auflösen ?

Für mehr Tests reicht meine Zeit momentan nicht - hoffe dass dir mein Feedback was bringt :)
Dateianhänge:
öffnen | Download - default_associate_label.jpg (52.6 KB)


Re: Domain class not found in grails-app/domain, trying hibernate mapped classes...

milkyman - 13.09.2010 15:44
hump schrieb:
-------------------------------------------------------
> Im List-View:
> Kombination aus Filter und Sortieren - bei
> Sortieren einer Spalte geht die Filterung wieder
> verloren.

Ups. Es ist eigentlich eines der neuen Features gewesen, dass sortieren und filtern parallel geht. Kannst du mir konkret sagen, in welcher Reihenfolge was nicht geht?

> ein filterable:false wäre schon praktisch,weil
> sonst recht lange Auswahllisten enstehen könnten.

Ok, hiermit als neues Feautures eingeplant.

> Sinnvoller scheint mir die Beschränkung auf ein
> Filterfeld, weil sonst bei Auswahl eines Filters
> eigentlich die Filterauswahl in den anderen
> Feldern aktualisiert werden müsste.

Wohl war. Das ist schon länger als Feature geplant, nur leider in der Umsetzung nicht ganz trivial. Genauso ist der Filter bei Datumswerten nicht immer optimal.

> Im Edit/Create-View:
> Lässt sich ein nullable Date nicht ohne Datum
> (NULL) eingeben.

Als Bug eingetragen, schau ich mir an.

> Die id ist nicht sichtbar, auch wenn sie
> generator:'assigned' ist.

Das ist aber schon in den Default-Templates 1.3.4 so, dass die id excluded wird. Aber wenn ich mich recht entsinne hast du da ja Strings = Namen drin stehen. Da macht das natürlich schon Sinn. Mit display/editable könnte man die id auch weiterhin ausblenden. Also könnte die aus den excludes raus. Schau ich mir an.

> Im Edit-View bei 1:n Relationen wird ein
> default.associate.label angezeigt - was hat das
> für eine Funktion ? (siehe Screenshot)

Guter Hinweis!!!
Ich habe ein paar zusätzliche keys in den message.properties angelegt, die aber noch nicht mit im plugin drin, weil damit anderes dort überschrieben werden könnte. In den InstallationInstructions habe ich die zusätzlichen Keys jetzt erwähnt und mit dem englischen Text versehen.
Kurz: Du kannst damit ein schon vorhandenes Objekt zuordnen, während die default Templates nur neue Objekte anlegen und zuordnen.

> bzw. wie kann man die Relation wieder auflösen ?

Dazu sollte eigentlich der korrespondierende default.deassociate.label kommen, sobald >= 1 Objekt zugeordnet ist und für dieses die 1-Seite nicht non-nullable ist. Kannst du das unter diesem Hintergrund nochmal anschauen? Wenn der deassociate nicht geht obwohl du meinst er sollte funktionieren, dann wären deine betroffenen Domains als Source hilfreich (ggf. per PM).
>
> Für mehr Tests reicht meine Zeit momentan nicht -
> hoffe dass dir mein Feedback was bringt :)

Ja das Feedback ist super!
Mir ist ja klar, dass es immer noch Ecken und Kanten gibt. Nur selber finde ich die aufgrund "Betriebsblindheit" bzw. fehlenden Testkonstellationen nicht. Die meisten Punkte sind sogar relativ einfach zu korrigieren. Man muss nur wissen, dass da noch ein Sonderfall nicht berücksichtigt wurde.

Vorschlag: Schau noch mal, ob dir meine Anmerkungen weiterhelfen oder ob es weitere Bugs gibt. Ich sammel das erstmal weiter und wenn du mit deiner Anwendung soweit fertig bist, würde ich mich dran machen die einzelnen Punkte abzuarbeiten und du bekommst nochmal ein Update.

Falls du echte Blocker hast, aufgrund derer du die Templates nicht weiter einsetzen kannst, sag Bescheid, dann schaue ich kurzfristig nach einer temporären Lösung für dich.

Bye,
Horst


Re: Domain class not found in grails-app/domain, trying hibernate mapped classes...

koeberle - 13.09.2010 17:10
> > ein filterable:false wäre schon praktisch,weil
> > sonst recht lange Auswahllisten enstehen
> könnten.
>
> Ok, hiermit als neues Feautures eingeplant.
Wenn du da schon planst ,dann denk doch mal darüber nach ab man da nicht ein optionales Autocomplete-Textfeld daraus machen sollte. Denn Code kann ich dir gerne beisteuern. Das Feature ist einfach zu gut um es auszuschalten nur weil man zu viele Daten haben könnte. Dann könnte man auch so Filtern, dass alles angezeigt wird das mit einer bestimmte Buchstabenkombination beginnt.

Christian


Re: Domain class not found in grails-app/domain, trying hibernate mapped classes...

milkyman - 13.09.2010 18:29
Hey, ihr seid richtig gut, was neue Ideen betrifft! <freu>

Da werd ich mit Sicherheit mal drüber nachdenken. Dürfte aber eine etwas größere Aktion werden. Nicht wegen des Autocomplete-AJAX, sondern wegen der resultierenden Queries.

Wobei es erstmal nur für Strings Sinn macht, oder?

Bei Zahlen und Datum wäre es eher ein von/bis Wertebereich. Da hab ich auch schonmal drüber nachgedacht.

Aber dann bin ich bald nicht mehr beim Filter, sondern bei einer Suche. Die hatte ich via searchable-plugin sogar schonmal voll integriert, aber jetzt wieder entfernt, weil das Plugin nicht weiterentwickelt wird und ein paar üble Bugs hat. Da warte ich jetzt lieber auf solr.

Bye,
Horst


Re: Domain class not found in grails-app/domain, trying hibernate mapped classes...

koeberle - 14.09.2010 15:25
Hallo Horst,

habe mir so nebenbei mal den Kopf über Filter für Zahlen zerbrochen. Eine Likesuche geht da natürlich nicht (gibt zwar Ausnahmen, aber das ist zu spezifisch). Damit kommt ein einfaches Filter/Suchfeld auch nicht in Frage. Zahlen haben aber die Angewohnheit genau ein Wert zu sein (eigentlich immer) damit resultieren einige Szenarien wie man da filtern / suchen muss.
Man sucht alles was:
genau einen Wert hat,
alles was kleiner ist als ein Wert,
alles was größer ist als ein Wert,
alles das sich zwischen zwei Werten befindet
alles das außerhalb eines Bereichs liegt (Bereich kann auch nur ein Wert sein)
Ok soweit ist das trivial, will aber verstanden sein, wenn man sich überlegt wie man vernünftig eine Benutzerinteraktion für so eine Frage baut.
Mögliche Lösungen:
Man gibt dem User ein Eingabefeld, in das er ein Formel tippen muss. Das ist einfach gebaut birgt einige Sicherheitslücken mit die man ausschalten muss und hat eigentlich nur Nachteile

Kombination aus Auswahlliste (<,=,>) und Textfeld für Zahl. Das kann man noch in den Kopf einer Spalte unterbringen, schließt aber die Möglichkeit nach Bereichen zu suchen aus.

Um die Bereichssuche auch noch mit unterzubringen bedarf es zwei Eingabefelder und eine Auswahl (<>, ><) Dass passt auf keine Fall mehr in einen Spaltenkopf. Vielmehr währe es Sinnvoll ein 'popup' zu Verfügung zu stellen wo man die Auswahl treffen kann, beim schließen des 'Popups' wir dann die Tabelle aktualisiert.


Christian


Re: Domain class not found in grails-app/domain, trying hibernate mapped classes...

hump - 14.09.2010 17:45
Zitat

Ups. Es ist eigentlich eines der neuen Features gewesen, dass sortieren und filtern parallel geht. Kannst du mir konkret sagen, in welcher Reihenfolge was nicht geht?

Zuerst Sortierung einstellen und dann filtern geht - allerdings verschwindet die Filterung wieder, wenn man neu sortiert.

Zitat

Vorschlag: Schau noch mal, ob dir meine Anmerkungen weiterhelfen oder ob es weitere Bugs gibt. Ich sammel das erstmal weiter und wenn du mit deiner Anwendung soweit fertig bist, würde ich mich dran machen die einzelnen Punkte abzuarbeiten und du bekommst nochmal ein Update.

Falls du echte Blocker hast, aufgrund derer du die Templates nicht weiter einsetzen kannst, sag Bescheid, dann schaue ich kurzfristig nach einer temporären Lösung für dich.

Naja, bin dzt. nicht wirklich am Erstellen einer Anwendung - wollte nur mal sehen, wieweit ich mit Grails Scaffolding und meiner Legacy-DB komme, dabei bin ich dann auf dein Plugin gestossen, dass mich schon deutlich weiter gebracht hat als die Standard-Templates.


Re: Domain class not found in grails-app/domain, trying hibernate mapped classes...

milkyman - 15.09.2010 11:51
Zitat
hump
> Zuerst Sortierung einstellen und dann filtern geht
> - allerdings verschwindet die Filterung wieder,
> wenn man neu sortiert.

Kannst du bitte mal schauen, wie der Link auf der Sortierung aussieht. Dan müsste man beim mouseOver sehen können. Eigentlich sollten da u.a. auch ein Parameter für "filter.propertyname" mit dabei sein. Wenn das nicht so ist, wurde da was nicht mit reingeneriert (via sortableParams im Controller-Code). Dann wären deine Domains hilfreich, um hier generieren und testen zu können.

Zitat
hump
> Naja, bin dzt. nicht wirklich am Erstellen einer
> Anwendung - wollte nur mal sehen, wieweit ich mit
> Grails Scaffolding und meiner Legacy-DB komme,
> dabei bin ich dann auf dein Plugin gestossen, dass
> mich schon deutlich weiter gebracht hat als die
> Standard-Templates.

D.h. deine Legacy-DB-Anwendung wird derzeit nicht wirklich benötigt?
Ok, dann sehe ich bei Gelegenheit mal zu, dass ich deine Anmerkungen mit berücksichtige.

Bye,
Horst


Stelle deine Groovy-Frage jetzt!


Diese Seite zeigt den Thread "Re: Domain class not found in grails-app/domain, trying hibernate mapped classes..." 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.