Hibernate:org.hibernate.WrongClassException,SINGLE_TABLE继承和DiscriminatorFormula

Por*_*cho 5 java hibernate hsqldb single-table-inheritance

我正在使用Hibernate 3.2.2 GA和HSQLDB 2.0 GA,我有一个类似于以下的类层次结构:

@Entity
@Table(name = "A_TABLE")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorFormula(value = "case when CODE IN (1, 2, 3, 4) then 'TypeB' 
when CODE   IN (5, 6, 7, 8) then 'TypeC' else NULL end")
@org.hibernate.annotations.Entity(dynamicUpdate = true, dynamicInsert = true)
public abstract class A{

 (...)

}


@Entity
@DiscriminatorValue("TypeB")
public class B extends A {

(...)

}


@Entity
@DiscriminatorValue("TypeC")
public class C extends A {

(...)

}
Run Code Online (Sandbox Code Playgroud)

我正在尝试执行以下HQL查询,该查询返回B和C类中的对象.

String hql = "from A a where a.someAttr = 3";
Query query = session.createQuery(hql);

return query.list();
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

org.hibernate.WrongClassException: Object with id: 2 was not of the specified subclass: A (Discriminator: C      )
Run Code Online (Sandbox Code Playgroud)

最奇怪的是id为2的对象一个C实例...

我GOOGLE了这个错误,我发现了一些谁是面对它,没有人用InheritanceType.SINGLE_TABLEDiscrimatorFormula,虽然.有没有人遇到这个问题?

Idr*_*ada 5

确保该实体列在您的配置文件中(例如,persistence.xml)。从/sf/answers/990544061/


Don*_*oby 1

问题是你得到了一个 A 列表,而 Hibernate 不知道如何根据判别器公式在列表中创建 B 或 C。幸运的是,有一个注释可以处理这个问题。

有些人称这是一个错误,我有点同意。无论如何,抽象似乎有点漏洞。

@ForceDiscriminator向父实体 ( )添加注释A,它可能会正常工作。

该解决方案是 Hibernate 特定的。我不确定问题是否会扩展到 JPA,或者是否有 JPA 解决方案。

编辑:

这似乎并没有达到目的。

尝试获取 hibernate 为您生成的 sql 可能是值得的。

添加

<property name="hibernate.show.sql" value="true" />
Run Code Online (Sandbox Code Playgroud)

到你的休眠配置,看看会发生什么。

获取带有和不带有force 子句的sql 可能会提供有关force 的确切作用以及它不起作用的原因的线索。

我目前想不出其他任何东西,除了NULL你的判别器公式看起来有点冒险。