Grails GORM non mantiene le classi di dominio astratte nel database, causando un'interruzione delle relazioni polimorfiche. Ad esempio:Classi astratte nelle relazioni 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
provocato da: org.hibernate.MappingException: Un'associazione dal documento tabella si riferisce a una classe mappata: Utente ... 25 more 2009-11- 11 23: 52: 58,933 [main] ERROR mortbay.log - Nidificato in org.springframework.beans.factory.BeanCreationException: errore nella creazione di bean con nome 'messageSource': Inizializzazione di bean fallita; l'eccezione annidata è org.springframework.beans.factory.BeanCreationException: Errore creazione bean con nome 'transactionManager': Impossibile risolvere il riferimento in bean 'sessionFactory' durante l'impostazione della proprietà bean 'sessionFactory'; l'eccezione nidificata è org.springframework.beans.factory.BeanCreationException: Errore creazione di bean con nome 'sessionFactory': Invocazione del metodo init non riuscita; eccezione annidata è org.hibernate.MappingException: Un associazione dal documento tabella si riferisce a una classe mappata: Utente: org.hibernate.MappingException: Un'associazione dal documento tavola si riferisce ad una classe mappata: Utente
Ma in questo scenario, voglio gli effetti polimorfici di consentire a qualsiasi utente di possedere un documento, mentre costringendo ogni utente del sistema a rientrare in uno dei ruoli definiti. Quindi, l'Utente non dovrebbe essere istanziato direttamente e reso astratto.
Non voglio usare un enum per i ruoli in una classe utente non astratta, perché voglio essere in grado di aggiungere proprietà aggiuntive ai diversi ruoli, che potrebbero non avere senso in determinati contesti (I don ' voglio avere un singolo utente con il ruolo impostato su RegularEmployee che ottiene in qualche modo un gruppo gestito non nullo).
Si tratta di un bug in Grails? Mi sto perdendo qualcosa?
Mi chiedo cosa significherebbe per una classe astratta essere mantenuta nel DB, poiché deve esserci qualcosa per persistere (cioè un'istanza). –
Bene, vorrei azzardare che una classe astratta sia la struttura preliminare dello schema, specialmente se è alla base di una relazione di ereditarietà. Quindi, se ho una relazione User-> RegularEmployee, il nome della tabella dovrebbe essere User e dovrebbe essere aggiunta una colonna per "class", che è usata per memorizzare il tipo a la tabella standard per modello di gerarchia. –