2010-04-12 14 views
5

Io cerco di usare questa mappatura:JPA: Inheritance - Valore discriminatore non presi in considerazione in SQL generato

@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; 
} 

Quando provo ad accedere al mio elenco entranceRates da un oggetto ratesGrid, ottengo questo errore:

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) 

Guardando lo sql generato, non ho trovato traccia di "discriminator =" nella clausola where. Cosa sto sbagliando?

Uso un database PostGreSQL e un Hibernate come provider JPA.

+0

Se provo a recuperare tutte le entryRates dal database con una query jpql, sql generato contiene la clausola "where discriminator =". Quindi il problema viene dalla mappatura nell'oggetto RatesGrid ma non riesco a trovare dove. Grazie, Julien – Julien

risposta

12

Non so se questo è un bug o una funzione (per me, si tratta di un bug), ma la soluzione (? Workaround) è quello di utilizzare l'annotazione Hibernate @ForceDiscriminator sul top class:

@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 { 
    ... 
} 

Si potrebbe voler votare per HHH-4358.

+0

Grazie mille, funziona perfettamente !! Julien – Julien

+11

A partire da Hibernate v ??, '@ ForceDiscriminator' è deprecato, usare' @DiscriminatorOptions (force = true) ' – Stephan

Problemi correlati