JPA:继承 - 生成的 SQL 中未考虑鉴别器值
Posted
技术标签:
【中文标题】JPA:继承 - 生成的 SQL 中未考虑鉴别器值【英文标题】:JPA : Inheritance - Discriminator value not taken into account in generated SQL 【发布时间】:2010-04-12 08:33:29 【问题描述】:我尝试使用这个映射:
@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;
当我尝试从 ratesGrid
对象访问我的 entranceRates
列表时,我收到此错误:
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)
查看生成的sql,发现where子句中没有“discriminator=”的痕迹。 我做错了什么?
我使用 PostGreSQL 数据库和 Hibernate 作为 JPA 提供程序。
【问题讨论】:
如果我尝试使用 jpql 查询从数据库中检索所有 entryRates,生成的 sql 包含“where discriminator="子句。所以问题来自 RatesGrid 对象中的映射,但我找不到在哪里。谢谢,朱利安 【参考方案1】:我不知道这是一个错误还是一个功能(对我来说,这是一个错误),但解决方案(解决方法?)是在您的***课程上使用 Hibernate 注释 @ForceDiscriminator
:
@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
...
您可能想投票给HHH-4358。
【讨论】:
从 Hibernate v?? 开始,@ForceDiscriminator
已弃用,请改用 @DiscriminatorOptions(force=true)
为我工作。谢谢。以上是关于JPA:继承 - 生成的 SQL 中未考虑鉴别器值的主要内容,如果未能解决你的问题,请参考以下文章
将名为 EMPLOYEE 的枚举映射到 VARCHAR 鉴别器值“M”
未知的鉴别器值“SqlException”,如何忽略动态类型的鉴别器