Java Hibernate:org.Hibernate.ErrorClassException,单表继承和鉴别器公式

Java Hibernate:org.Hibernate.ErrorClassException,单表继承和鉴别器公式,java,hibernate,hsqldb,single-table-inheritance,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) the

我将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 {

(...)

}
我正在尝试执行以下HQL查询,它返回来自B和C类的对象

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

return query.list();
但是,我得到以下错误:

org.hibernate.WrongClassException: Object with id: 2 was not of the specified subclass: A (Discriminator: C      )
最奇怪的是id为2的对象是C实例


我在谷歌上搜索了这个错误,发现一些人遇到了这个错误,但没有人使用
InheritanceType.SINGLE\u TABLE
DiscrimatorFormula
。有人遇到过这个问题吗?

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

有些人把这叫做bug,我也有点同意。无论如何,抽象似乎有点漏洞百出

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

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

编辑:

这似乎没有奏效

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


转到hibernate配置并查看发生了什么

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


我现在想不出其他任何东西,除了你的鉴别器公式中的
NULL
看起来有点危险。

好吧,这让我很好奇:可能是你患了以下疾病:

原因是字符串被解释为字符类型,而不是 瓦查尔。我们将来可能会改变这种行为


您是否可以尝试对结果应用TRIM()(在
@DiscriminatorFormula
中)或使用其他DBMS进行测试?这似乎不是特定于Hibernate的。

确保配置文件(例如persistence.xml)中列出了该实体。从

中,我使用DTYPE列和WHERE子句解决了这个问题。 以你的例子来说,应该是:

@Entity
@WHERE(clause = "DTYPE = 'B'")
public class B extends A {
 ...
}


@Entity
@WHERE(clause = "DTYPE = 'C'")
public class C extends A {
 ...
}

它不起作用。在我将@ForceDiscriminator添加到A之后,我仍然得到错误的类异常。还有其他想法吗?谢谢我经历过这一切。如果可以,请将调试器附加到Hibernate
加载程序
SingleTableEntityPersister
类。后者将实际的子类存储在字段
subassesbydiscriminatorvalue
中。检查键,并比较实际传入的内容。您的输入看起来可疑地填充了空格。
@Entity
@WHERE(clause = "DTYPE = 'B'")
public class B extends A {
 ...
}


@Entity
@WHERE(clause = "DTYPE = 'C'")
public class C extends A {
 ...
}