Grails GORM no persiste clases abstractas de dominio en la base de datos, lo que provoca una interrupción en las relaciones polimórficas. Por ejemplo:Clases abstractas en relaciones GORM
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)
}
}
provoca
causada por: org.hibernate.MappingException: Una asociación a partir del documento tabla se refiere a una clase de unmapped: User ... 25 más 2009-11- 11 23: 52: 58,933 [main] ERROR mortbay.log - Anidado en org.springframework.beans.factory.BeanCreationException: error al crear bean con el nombre 'messageSource': Inicialización del bean falló; la excepción anidada es org.springframework.beans.factory.BeanCreationException: Error creando bean con el nombre 'transactionManager': No se puede resolver la referencia para bean 'sessionFactory' mientras se configura la propiedad bean 'sessionFactory'; excepción anidada es org.springframework.beans.factory.BeanCreationException: Error creando bean con el nombre 'sessionFactory': Invocación del método init failed; excepción anidada es org.hibernate.MappingException: Un asociación del documento de tabla se refiere a una clase de unmapped: Usuario: org.hibernate.MappingException: Una asociación a partir del documento mesa se refiere a una clase de unmapped: User
Pero en este escenario, quiero los efectos polimórficos de permitir que cualquier usuario posea un documento, mientras forzo a cada usuario del sistema a encajar en una de las funciones definidas. Por lo tanto, el usuario no debe ser instanciado directamente y se hace abstracto.
No quiero usar una enumeración de roles en una clase de usuario no abstracta, porque quiero poder agregar propiedades adicionales a los diferentes roles, lo que puede no tener sentido en ciertos contextos (no lo hago) t quiero tener un usuario único con la función establecida en RegularEmployee que de alguna manera obtenga un grupo administrado no nulo).
¿Esto es un error en Grails? ¿Me estoy perdiendo de algo?
Me pregunto qué significaría que una clase abstracta persista en el DB, ya que tiene que haber algo para persistir (es decir, una instancia). –
Bueno, me atrevo a aventurar que una clase abstracta es el esquema del esquema preliminar, especialmente si está en la raíz de una relación de herencia. Entonces, si tengo una relación Usuario-> EmpleadoEmpleo, el nombre de la tabla debe ser Usuario y se debe agregar una columna para "clase", que se usa para almacenar el tipo al estilo del modelo estándar de tabla por jerarquía. –