Grails: Domain-Klasse-Mapping (Sammlung von Hibernate Benutzertypen)
-
26-09-2019 - |
Frage
Ich frage mich, ob möglich ist folgendes Domänenmodell zu implementieren.
Lassen Sie sich eine Domain-Klasse, die von Intervallen (joda Zeit) eingestellt enthält. Ich kann org.joda.time.contrib.hibernate.PersistentInterval Hibernate Benutzertyp für die Zuordnung von Intervall zu Datenbanktabelle (durch ähnliche Art und Weise wie in http://www.grails.org/JodaTime+Plugin ). Allerdings kann ich nicht herausfinden, wie Zuordnung zu implementieren, wenn ich von Intervallen festgelegt habe, nicht nur ein Intervall.
Beispiel:
class Activity { ... Set intervals = [] ... static hasMany = [ intervals: org.joda.time.Interval ] // This is incorrect implementation, I have set of intervals // and this would be correct if I had only one interval // How to implement mapping in this case? static mapping = { intervals type: PersistentInterval, { column name: "start" column name: "end" } }
}
Implementierung oben nicht mit folgenden Fehlern:
2010-10-23 18: 30: 25.483 [main] ERROR context.GrailsContextLoader - Fehler Ausführen Schopf: Fehler beim Erstellen Bean mit dem Namen ‚Message‘: Initialisierung der Bohne fehlgeschlagen; verschachtelte Ausnahme ist org.springframework.beans.factory.BeanCreationException: Fehler beim Erstellen der Bohne mit dem Namen ‚Transaction‘: kann nicht aufgelöst werden Bezugnahme auf bean ‚session‘ während Einstellung Bean-Eigenschaft ‚Session‘; verschachtelte Ausnahme ist org.springframework.beans.factory.BeanCreationException: Fehler beim Erstellen der Bohne mit dem Namen 'Session': Invocation von init Verfahren versagt; verschachtelte Ausnahme ist org.hibernate.MappingException: Unbekannter Schlüssel (FK4FDC5B1E5107CA0: activity_intervals [Start, Ende])) müssen gleiche Anzahl haben, Spalten wie die referenzierten Primärschlüssel (Aktivität [id]) org.springframework.beans.factory.BeanCreationException: Fehler beim Erstellen der Bohne mit dem Namen ‚Message‘: Initialisierung bean fehlgeschlagen; verschachtelte Ausnahme ist org.springframework.beans.factory.BeanCreationException: Fehler beim Erstellen der Bohne mit dem Namen ‚Transaction‘: kann nicht aufgelöst werden Bezugnahme auf bean ‚session‘ während Einstellung Bean-Eigenschaft ‚Session‘; verschachtelte Ausnahme ist org.springframework.beans.factory.BeanCreationException: Fehler beim Erstellen der Bohne mit dem Namen 'Session': Invocation von init Verfahren versagt; verschachtelte Ausnahme ist org.hibernate.MappingException: Unbekannter Schlüssel (FK4FDC5B1E5107CA0: activity_intervals [Start, Ende])) müssen gleiche Anzahl haben, Spalten wie die referenzierten Primärschlüssel (Aktivität [id]) bei org.grails.tomcat.TomcatServer.start (TomcatServer.groovy: 212)
dachte ich, dass Work-around für dieses Problem ist Intervall auf separate Domäne-Klasse erweitert Intervall zu extrahieren und geben Mapping innerhalb dieser Gruppe. Allerdings Intervall ist letzte Klasse so erweitert nicht möglich.
Vielen Dank für Ihre Ratschläge.
Lösung
Ich bin meine eigene Frage beantworten, vielleicht diese Antwort für jemanden nützlich sein.
Bis jetzt habe ich nur einen Weg gefunden, wie bestimmtes Modell zu implementieren - von Hibernate XML-Mapping-Dateien :
<hibernate-mapping package="mappingtest">
<class name="Activity">
<id name="id">
<generator class="native"/>
</id>
<set name="intervals">
<key column="activity_id" not-null="true"/>
<element type="org.joda.time.contrib.hibernate.PersistentInterval">
<column name="startDate"/>
<column name="endDate"/>
</element>
</set>
</class>
</hibernate-mapping>
und Domain-Klasse Implementierung:
class Activity {
Long id
Set intervals = []
static constraints = {
}
}
Ich habe auch zu bewegen Domain-Klasse von Grails-app / Domain src / groovy Verzeichnis, sonst läuft Anwendung kann nicht mit (Grails-1.3.5):
...
org.hibernate.DuplicateMappingException: Doppelte Klasse / Entitätszuordnung mappingtest.Activity
...
Zweites Problem mit obiger Implementierung ich entdeckt habe, ist, dass, wenn ich auf Gerüste eingeschaltet (zu Testzwecken) von:
class ActivityController {
static scaffold = true
...
}
zeigt von erstellten Aktivität fehlgeschlagen mit Fehlern:
Ausnahmemeldung: Keine solche Eigenschaft: id für die Klasse: org.joda.time.Interval Mögliche Lösungen: Ende Verursacht durch: Fehler bei der Auswertung Ausdruck [i.id] auf line [38]: Eine solche Eigenschaft: id für Klasse: org.joda.time.Interval Mögliche Lösungen: Ende
aber manuelle Durchführung der Aktivitäten von DB und seiner Vorführung immer gearbeitet.
Edit: zusätzlich fand ich Lösung von Gerüsten und DuplicateMappingException Fragen. Sie wurden durch ungültige Stelle von Activity.hbm.xml verursacht - Paket Verzeichnisstruktur fehlte. Die korrekte Lage ist Grails-app / conf / Hibernate / mappingtest / Activity.hbm.xml.