带 H2 的 ClassCastException
Posted
技术标签:
【中文标题】带 H2 的 ClassCastException【英文标题】:ClassCastException with H2 【发布时间】:2013-05-06 09:29:34 【问题描述】:我将 h2 用于测试目的,但在转换为派生类时遇到问题。案例是:
@Entity
@DiscriminatorColumn(name = "DTYPE", discriminatorType = DiscriminatorType.STRING, length = 64)
public class A ...
@Entity
@DiscriminatorColumn(name = "DTYPE", discriminatorType = DiscriminatorType.STRING, length = 64)
public class B extends A ...
我的数据集如下所示:
<A attr1=... attr2=... DTYPE="A"/>
<B attr1=... attr2=... DTYPE="B"/>
问题是当我尝试在 JPA 中进行这样的查询时:
Query q = em.createQuery("SELECT a FROM A a WHERE...");
我尝试得到这样的值:
(B) q.getResultList().get(0);
我有以下异常:
java.lang.ClassCastException: mypackage.A cannot be cast to mypackage.B
在 mysql 中它工作正常,但在 H2 中不行。 H2版本:1.3.171
【问题讨论】:
【参考方案1】:假设q.getResultList()
返回A
对象列表,
B
扩展A
,因此B
可以转换为A
。然而,反过来是不正确的。 A
的实例不能转换为 B
。
【讨论】:
查询的结果总是B类的,问题是数据库中没有B的表,A的表有判别器。所以 A 和 B 条目在同一个表中。 我认为问题是H2不承认表A可以有B类型的条目。即使你的解释是对的,我的问题是不同的。【参考方案2】:最后的问题是,鉴别器值在 H2 中不能很好地工作,我希望与 hibernate 和 mysql 具有相同的行为,但这是错误的。
【讨论】:
以上是关于带 H2 的 ClassCastException的主要内容,如果未能解决你的问题,请参考以下文章
Liquibase:使用带 H2 数据库的 modifyDataType 重构将 INT 自动增量列更改为 BIGINT