2010-04-12 11 views
5

trato de usar este mapeo:JPA: Herencia - valor discriminador no se tiene en cuenta en el SQL generado

@Entity 
@Table(name="ecc.\"RATE\"") 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="DISCRIMINATOR", discriminatorType= DiscriminatorType.STRING) 
public abstract class Rate extends GenericBusinessObject { 
... 
} 

@Entity 
@DiscriminatorValue("E") 
public class EntranceRate extends Rate { 
@ManyToOne 
@JoinColumn(name = "\"RATES_GRID_ID\"") 
protected RatesGrid ratesGrid; 
... 
} 


@Entity 
@Table(name="ecc.\"RATES_GRID\"") 
public class RatesGrid extends GenericBusinessObject { 
/** */ 
@OneToMany(mappedBy = "ratesGrid", targetEntity = EntranceRate.class, fetch=FetchType.LAZY) 
private List<EntranceRate> entranceRates; 
} 

Cuando intento acceder a mi lista entranceRates de un objeto ratesGrid, me sale este error:

Object with id: 151 was not of the specified subclass: com.ecc.bo.rate.EntranceRate (loaded object was of wrong class class com.ecc.bo.rate.AnnualRate) 

Al observar el sql generado, no encontré rastro de "discriminator =" en la cláusula where. ¿Qué estoy haciendo mal?

Utilizo una base de datos PostGreSQL y un Hibernate como proveedor JPA.

+0

Si trato de recuperar todas las entradas de la base de datos con una consulta jpql, el sql generado contiene la cláusula "where discriminator =". Así que el problema proviene de la asignación en el objeto RatesGrid, pero no puedo encontrar dónde. Gracias, Julien – Julien

Respuesta

12

No sé si esto es un error o una función (para mí, es un error), pero la solución (? Solución) es el uso de la anotación de Hibernate @ForceDiscriminator en su primera clase:

@Entity 
@Table(name="ecc.\"RATE\"") 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="DISCRIMINATOR", discriminatorType= DiscriminatorType.STRING) 
@org.hibernate.annotations.ForceDiscriminator 
public abstract class Rate extends GenericBusinessObject { 
    ... 
} 

Es posible que desee votar por HHH-4358.

+0

Muchas gracias, funciona perfectamente !! Julien – Julien

+11

A partir de Hibernate v ??, '@ ForceDiscriminator' está en desuso, use' @DiscriminatorOptions (force = true) 'en su lugar – Stephan

Cuestiones relacionadas