2010-04-12 5 views
5

staram się korzystać z tego mapowania:JPA: Dziedziczenie - wartość Discriminator nie uwzględniane w wygenerowanym SQL

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

Kiedy próbuję uzyskać dostęp do mojej listy entranceRates z ratesGrid obiektu, otrzymuję ten błąd:

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) 

Patrząc na wygenerowany sql, nie znalazłem śladu "discriminator =" w klauzuli where. Co robię źle?

Używam bazy danych PostGreSQL i Hibernate jako dostawcy JPA.

+0

Jeśli spróbuję pobrać wszystkie wartości wejściowe z bazy danych za pomocą zapytania jpql, wygenerowany sql zawiera klauzulę "where discriminator =". Problem pochodzi z mapowania w obiekcie RatesGrid, ale nie mogę go znaleźć. Dzięki, Julien – Julien

Odpowiedz

12

ja nie wiem, czy jest to błąd lub funkcja (dla mnie, jest to bug), ale rozwiązanie (? Obejście) jest użycie adnotacji hibernacji @ForceDiscriminator na najwyższej klasy:

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

Możesz chcieć głosować na HHH-4358.

+0

Dziękuję bardzo, działa idealnie !! Julien – Julien

+11

Od wersji Hibernate v ??, '@ ForceDiscriminator' jest przestarzałe, użyj' @DiscriminatorOptions (force = true) 'zamiast – Stephan

Powiązane problemy