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_TABLE和DiscrimatorFormula,虽然.有没有人遇到这个问题?
问题是你得到了一个 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你的判别器公式看起来有点冒险。