2009-07-16 19 views
5

Tengo un convertidor JSF que uso para una lista SelectItem que contiene varios tipos de entidades diferentes. En el método getAsString() creo la cadena como el nombre de clase con el sufijo ":" y la ID.Cargando javassist-ed Hibernate entidad

MySuperClass superClass = (MySuperClass)value; 
if(superClass != null) { 
    return String.valueOf(superClass.getClass().getName()+":"+superClass.getId()); 
} 

Esto me permite cargar la entidad correcta en el getAsObject() en el camino de regreso de la interfaz de usuario al hacer esto:

String className = value.substring(0, value.indexOf(":")); 
long id = Long.parseLong(value.substring(value.indexOf(":")+1)); 
Class<T> entitySuperClass = (Class<T>) Class.forName(className); 
MySuperClass superClass = (MySuperClass)getEntityManager().find(entitySuperClass, id); 

Mi problema es que mi entidad en getAsString() es un proxy. Entonces en lugar de obtener com.company.MyEntity cuando hago un getClass(). GetName() obtengo com.company.MyEntity_$$_javassist_48 entonces falla en el find().

¿Hay alguna manera (además de la manipulación de cadenas) para obtener el nombre de la clase concreta (por ejemplo, com.company.MyEntity)?

Gracias.

Respuesta

9

En lugar de superClass.getClass() intente org.hibernate.proxy.HibernateProxyHelper.getClassWithoutInitializingProxy(superClass).

+0

I' ve used ((HibernateProxy) entidad) .getHibernateLazyInitializer(). getEntityName() o getPersistentClass() pero HibernateProxy lo ajusta así que probablemente sea el camino a seguir. –

+11

o simplemente Hibernate.getClass() –

+0

Buena respuesta chicos. Me ayudó mucho. – Mythul

6

Hay una diferencia importante entre Hibernate.getClass() y HibernateProxyHelper! El HibernateProxyHelper siempre devuelve la superclase que representa la tabla en la base de datos y si tiene entidad que se asignan mediante

@Table(name = SuperClass.TABLE_NAME) 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = SuperClass.TABLE_DISCRIMINATOR, discriminatorType = DiscriminatorType.STRING) 

y

@DiscriminatorValue(value = EntityClass.TABLE_DISCRIMINATOR) 

en la subclase.

Hibernate.getClass (...) devuelve la subclase real para aquellos.

3

Cuando se combina con la herencia de entidad abstracta (AbstractEntity < - ConcreteEntity < - ConcreteEntityProxy), consiguiendo la clase de persistencia no es suficiente:

// This should fail - trying to create an abstract class 
HibernateProxyHelper.getClassWithoutInitializingProxy(superClass).newInstance() 

en lugar de obtener la clase de implementación:

protected <T> T deproxy(T maybeProxy) { 
    if (maybeProxy instanceof HibernateProxy) { 
     return (T) ((HibernateProxy) maybeProxy).getHibernateLazyInitializer().getImplementation(); 
    } 
    return maybeProxy; 
} 
Cuestiones relacionadas