【问题标题】:After upgrade to HSQL 2.0.1.rc3 - Lots of org.hsqldb.HsqlException: data exception: ... cast complaints升级到 HSQL 2.0.1.rc3 后 - 大量 org.hsqldb.HsqlException: data exception: ... cast 投诉
【发布时间】:2013-04-11 20:14:24
【问题描述】:

我最近将 HSQL 从 1.8.0.10 升级到 2.0,然后升级到 2.0.1.rc3,而我的代码或测试数据没有任何变化。我有很多以前有效的测试,现在我遇到了很多涉及“强制转换”的异常......

Caused by: org.hsqldb.HsqlException: data exception: invalid character value for cast

不幸的是,异常消息很差,我几乎不知道哪一列等是坏的。

其他异常表明它正在尝试将 sysadmin 用户名投诉到很长??

Caused by: org.hsqldb.HsqlException: incompatible data type in conversion: from SQL type VARCHAR to java.lang.Long, value: SA
    at org.hsqldb.error.Error.error(Error.java:77)
    ... 54 more

真正奇怪的是,我在内存模式下使用 HSQL 并以空启动它并且从未设置任何访问权限。

PS

我也将 Hibernate 更新到了 3.6。

【问题讨论】:

    标签: java hsqldb


    【解决方案1】:

    我刚刚遇到了类似的问题,升级到 HSQLDB 2.2.9 后,一些单元测试开始失败并显示以下错误消息:

    java.sql.SQLSyntaxErrorException: incompatible data type in conversion: from SQL type VARCHAR to java.math.BigDecimal, value: SA
    

    该问题仅在使用 DBUnit 操作数据集时出现,使用 Hibernate 时没有问题。打开 JDBC 日志后,我发现 DBUnit 在这样的选择后失败了:

    select id, user from MYTABLE order by id
    
    // then, SQLSyntaxErrorException when DBUnit tried to retrieve the 'user' column:
    BigDecimal userId = resultSet.getBigDecimal(2);
    

    This answer 导致原因:DBUnit 默认不会转义'user'关键字,这就解释了为什么错误消息的值为“SA”,即默认的HSQLDB系统用户。但是,DBUnit 确实允许您configure escaping,从而解决了问题。

    最后,Hibernate 没有出现问题的原因是它生成的 SQL 更明确,例如

    select mytable0.id, mytable0.user from MYTABLE mytable0 order by mytable0.id
    

    总结:

    找出哪个库没有在 SQL 语句中转义关键字!

    【讨论】:

      【解决方案2】:

      自动转换行为在 2.x 版本中变得更加严格。这可能是问题的原因,但是如果没有看到实际的表定义和 Hibernate 执行的语句,就不可能说出在哪里。使用最新的 HSQLDB RC,广泛的 Hibernate 测试套件运行时几乎没有(和无关的)错误。

      【讨论】:

      • Hi THanx for HSQL - 是否可以在异常消息中包含实际的违规列、from 和 to 类型以及可能的数据。
      • 这个我以后会改进。但是当您使用 Hibernate 时,您可以在 Hibernate 中打开语句执行的详细报告并找到有问题的语句。
      • 另一个可能的原因是存在多个 HSQLDB jar,因为 SA 到 Long 的类型转换看起来有些不可能。
      • 很多时候这些异常发生在休眠的启动阶段。我的cp上只有一个hsqldb.jar。
      • 您可以随时向 HSQLDB 项目发送一个测试用例,其中包含您的一些启动并显示问题。
      【解决方案3】:

      我们在打包自定义版本的 hsqldb 时遇到了同样的问题(需要解决这个问题 Hibernate/hsqldb 2 Cannot Hydrate Blob Column

      当前的 hsqldb 源 jar 包含旧版本的 org.hibernate,它不能正确识别 hsqldb 版本(讽刺)。如果此源代码包含在您的构建中,那么它可能会覆盖该类的实际 hibernate 3.6 版本。

      检查你的 hsqldb jar 依赖关系,看看它是否包含任何 org.hibernate 类

      或尝试将以下内容放入您的代码中,以查看所使用的方言来自何处:

      System.out.println(
          new HSQLDialect().getClass().getProtectionDomain().getCodeSource());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 2012-03-15
        • 1970-01-01
        • 2023-03-22
        • 2018-09-30
        相关资源
        最近更新 更多