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”,如何忽略动态类型的鉴别器

我可以使用 Entity Framework 4 CTP5 访问 TPH 映射中的鉴别器值吗

未找到鉴别器键时的 Mongoid 行为

传递给持久化的分离实体:JPA 继承

JPA 鉴别器类型性能