Grailles GORM ne conserve pas les classes de domaine abstraites dans la base de données, provoquant une rupture des relations polymorphes. Par exemple:Classes abstraites dans les relations 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)
}
}
provoque
Causée par: org.hibernate.MappingException: Une association du document de table fait référence à une classe unmapped: User ... 25 plus 2009-11- 11 23: 52: 58,933 [principal] ERREUR mortbay.log - imbriqué dans org.springframework.beans.factory.BeanCreationException: Erreur lors de la création du bean avec le nom 'messageSource': L'initialisation du bean a échoué; l'exception imbriquée est org.springframework.beans.factory.BeanCreationException: erreur création d'un bean avec le nom 'transactionManager': impossible de résoudre la référence en bean 'sessionFactory' lors de la définition de la propriété bean 'sessionFactory'; l'exception imbriquée est org.springframework.beans.factory.BeanCreationException: erreur création d'un bean avec le nom 'sessionFactory': l'appel de la méthode init a échoué; exception imbriquée est org.hibernate.MappingException: Une association du document de tableau fait référence à une classe non cartographiées: Utilisateur: org.hibernate.MappingException: Une association du document de table fait référence à une classe unmapped: User
Mais dans ce scénario, je veux les effets polymorphiques de permettre à tout utilisateur de posséder un document, tout en forçant chaque utilisateur du système à s'intégrer dans l'un des rôles définis. Par conséquent, l'utilisateur ne doit pas être directement instancié et est rendu abstrait. Je ne veux pas utiliser une énumération pour les rôles dans une classe User non abstraite, car je veux pouvoir ajouter des propriétés supplémentaires aux différents rôles, ce qui peut ne pas avoir de sens dans certains contextes (I do ' Je veux avoir un seul utilisateur avec un rôle défini sur RegularEmployee qui obtient en quelque sorte un managedGroup non nul).
Est-ce un bug dans Grails? Est-ce que je manque quelque chose?
Je me demande ce que cela signifierait pour qu'une classe abstraite soit conservée dans la base de données, car il doit y avoir quelque chose à persister (c'est-à-dire, une instance). –
Eh bien, je dirais qu'une classe abstraite est le schéma préliminaire du schéma, surtout si c'est à la racine d'une relation d'héritage. Donc, si j'ai une relation Utilisateur-> RegularEmployee, le nom de la table doit être User et une colonne doit être ajoutée pour "class", qui est utilisée pour stocker le type dans le modèle standard de table par hiérarchie. –