2012-07-11 21 views
6

He modelado mis clases de dominio en Grails con herencia como se muestra a continuación.Grails/Groovy domain classes inheritance cast

abstract class Profile{ 
} 

class Team extends Profile{ 
} 

class User extends Profile{ 
} 

class B{ 
    static hasMany = [profiles: Profile] 
} 

Más tarde, en los controladores cuando llegue a todos los perfiles de la clase B en algunas situaciones me gustaría enviar algunos de los perfiles a Equipo o al usuario, pero no puedo porque me conseguir un java. lang.ClassCastException o GroovyCastException, aunque se guardan como un Equipo o Usuario (con la clase de atributo en la base de datos). Aquí están las maneras que he intentado:

def team1 = b.profiles.toList()[0] as Team 

def team1 = (Team)b.profiles.toList()[0] 

Está funcionando cuando no escribo cualquier tipo sólo lo utilizan como es normal en un lenguaje dinámico.

def team1 = b.profiles.toList()[0] 

Pero nunca sé qué clase estoy usando. ¿Hay alguna forma de groovy o gorm para lanzar la clase de padres a hijos?

+0

No hay [discriminador] (http://grails.org/doc/latest/ref/Database%20Mapping/discriminator.html) para gorm que elegir entre ' Usuario' o 'Equipo'. ¿Cómo debe decidir Gorm qué implementación usar? – krock

+0

Se guarda en la misma tabla en la base de datos con un atributo de clase que indica de qué clase se trata. – sgleser87

Respuesta

4

La respuesta es No como instancia real de GORM/Hibernación es un objeto con proxy. Por lo tanto, no se puede convertir a una clase de entidad directamente.

De todos modos esto podría ayudar:

def team1 = b.profiles.toList()[0] 
if(team1.instanceOf(Team)) { 
    // I am an instance of Team 
    // do something here. 
} 
+0

Está funcionando, pero en realidad esa no era mi pregunta. Mi pregunta era si hay una forma de convertir explícitamente la clase base a la subclase. – sgleser87

+3

No, porque el proxy de hibernación no es necesariamente una "instancia de" la subclase en el sentido de Java de la palabra. La clase proxy es una subclase generada dinámicamente del tipo _declared_ de 'b.profiles' (es decir,' Profile'). [Este artículo] (http://blog.springsource.org/2010/07/28/gorm-gotchas-part-3/) tiene los detalles sangrientos, y (y los otros artículos de la misma serie) valen la pena una lectura –

+3

Siempre hay 'GrailsHibernateUtil.unwrapIfProxy', que eliminará el contenedor proxy y le dará el objeto real (que luego puede convertir) pero esto tendrá que golpear la base de datos si el objeto real no se ha cargado todavía. –