【发布时间】:2011-08-05 18:38:50
【问题描述】:
我正在使用 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_TABLE 和 DiscrimatorFormula。有人遇到过这个问题吗?
【问题讨论】:
-
我经历过这个。如果可以,请将调试器附加到 Hibernate
Loader或SingleTableEntityPersister类。后者将实际的子类存储在字段subclassesByDiscriminatorValue中。检查密钥,并比较那里实际传递的内容。您的输入看起来可疑地用空格填充。
标签: java hibernate hsqldb single-table-inheritance