Grails GORM speichert keine abstrakten Domänenklassen in der Datenbank, was zu einem Bruch der polymorphen Beziehungen führt. Zum Beispiel:Abstrakte Klassen in GORM-Beziehungen
abstract class User {
String email
String password
static constraints = {
email(blank:false, nullable:false,email:true)
password(blank:false, password:true)
}
static hasMany = [membership:GroupMembership]
}
class RegularEmployee extends User {}
class Manager extends User {
Workgroup managedGroup
}
class Document {
String name
String description
int fileSize
String fileExtension
User owner
Date creationTime
Date lastModifiedTime
DocumentData myData
boolean isCheckedOut
enum Sensitivity {LOW,MEDIUM,HIGH}
def documentImportance = Sensitivity.LOW
static constraints = {
name(nullable:false, blank:false)
description(nullable:false, blank:false)
fileSize(nullable:false)
fileExtension(nullable:false)
owner(nullable:false)
myData(nullable:false)
}
}
verursacht
Verursacht durch: org.hibernate.MappingException: Ein Verein aus dem Tabelle Dokument bezieht sich auf eine nicht zugeordneten Klasse: User ... 25 weitere 2009-11- 11 23: 52: 58.933 [main] FEHLER mortbay.log - Verschachtelt in org.springframework.beans.factory.BeanCreationException: Fehler beim Erstellen der Bean mit dem Namen 'messageSource': Initialisierung der Bean fehlgeschlagen; Verschachtelte Ausnahme ist org.springframework.beans.factory.BeanCreationException: Fehler Erstellen Bean mit Name 'transactionManager': Kann Referenz zu Bean 'SessionFactory' nicht aufgelöst werden beim Festlegen der Bean Eigenschaft 'sessionFactory'; verschachtelte Ausnahme ist org.springframework.beans.factory.BeanCreationException: Fehler Erstellen von Bean mit Name 'SessionFactory': Aufruf der Init-Methode fehlgeschlagen; nested Ausnahme ist org.hibernate.MappingException: Eine Vereinigung aus der Tabelle Dokument an eine nicht zugeordnete Klasse bezieht: User: org.hibernate.MappingException: Eine Vereinigung aus der Tabelle Dokument zu einer nicht zugeordneten Klasse verweist: User
Aber in diesem Szenario möchte ich die polymorphen Auswirkungen, die es jedem Benutzer erlauben, ein Dokument zu besitzen, während jeder Benutzer des Systems gezwungen wird, in eine der definierten Rollen zu passen. Daher sollte der Benutzer nicht direkt instanziiert und abstrakt gemacht werden.
Ich möchte keine Aufzählung für Rollen in einer nicht abstrakten Benutzerklasse verwenden, weil ich in der Lage sein möchte, den verschiedenen Rollen zusätzliche Eigenschaften hinzuzufügen, die in bestimmten Kontexten keinen Sinn ergeben (I don ' t möchte einen einzelnen Benutzer haben, dessen Rolle auf RegularEmployee gesetzt ist, der irgendwie eine nicht-null-managedGroup erhält).
Ist das ein Fehler in Grails? Fehle ich etwas?
Ich frage mich, was es bedeuten würde für eine abstrakte Klasse in der DB beibehalten werden, da es etwas geben muss (d. H. Eine Instanz). –
Nun, ich würde wagen, dass eine abstrakte Klasse ist die vorläufige Schema-Gliederung, vor allem wenn es als die Wurzel einer Vererbungsbeziehung. Wenn ich also eine Benutzer-> RegularEmployee-Beziehung habe, sollte der Tabellenname Benutzer sein und eine Spalte für "Klasse" hinzugefügt werden, die zum Speichern des Typs nach dem Standardmodell für jede Tabelle verwendet wird. –