【问题标题】:ClassCastException with H2带 H2 的 ClassCastException
【发布时间】: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

【问题讨论】:

    标签: java jpa integration-testing h2


    【解决方案1】:

    假设q.getResultList()返回A对象列表,

    B 扩展A,因此B 可以转换为A。然而,反过来是不正确的。 A 的实例不能转换为 B

    【讨论】:

    • 查询的结果总是B类的,问题是数据库中没有B的表,A的表有判别器。所以 A 和 B 条目在同一个表中。
    • 我认为问题是H2不承认表A可以有B类型的条目。即使你的解释是对的,我的问题是不同的。
    【解决方案2】:

    最后的问题是,鉴别器值在 H2 中不能很好地工作,我希望与 hibernate 和 mysql 具有相同的行为,但这是错误的。

    【讨论】:

      猜你喜欢
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      • 2014-05-14
      • 2019-09-18
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多