Java HibernateException:错误的列类型:x,Sybase上应为y

Java HibernateException:错误的列类型:x,Sybase上应为y,java,hibernate,sybase,Java,Hibernate,Sybase,我对下面的技术没有太多的背景知识,所以如果有任何帮助,我将不胜感激。如果有不清楚的地方,请随时提问 我目前正在进行一个迁移项目,我们正在更新一系列技术,包括: Sybase-从12.x到15.7 JConnect-从多个版本到7.0.7_SP130 现在,我们的应用程序被部署到JBoss4.x上,并使用Hibernate3.2.4.sp1。在旧数据库中,我们有许多自定义数据类型,看起来像这样(很抱歉,本想将其设置为表格式,但我不知道如何在这里…): 自定义数据类型:TYPE1,基本数据类型:i

我对下面的技术没有太多的背景知识,所以如果有任何帮助,我将不胜感激。如果有不清楚的地方,请随时提问

我目前正在进行一个迁移项目,我们正在更新一系列技术,包括:

  • Sybase-从12.x到15.7
  • JConnect-从多个版本到7.0.7_SP130
  • 现在,我们的应用程序被部署到JBoss4.x上,并使用Hibernate3.2.4.sp1。在旧数据库中,我们有许多自定义数据类型,看起来像这样(很抱歉,本想将其设置为表格式,但我不知道如何在这里…):

    • 自定义数据类型:TYPE1,基本数据类型:image
    • 自定义数据类型:TYPE2,基本数据类型:tinyint
    DDL中的某些列使用自定义数据类型:

    CREATE TABLE y (
       our_column_name TYPE1,
       ...
    );
    
    服务器启动时,我收到以下错误消息:

    。。。 javax.persistence.PersistenceException: org.hibernate.hibernate异常:列类型错误:我们的列名称, 预期:图像

    这不是旧设置中发生的情况。请注意,在我们定义的所有自定义数据类型中,只有那些带有image和tinyint的数据类型有问题;其他的被识别并且不会抛出错误

    我们在JConnect驱动程序上运行了一个跟踪,它似乎正在检索正确的数据类型,这就是我现在关注HibernateeException的原因。我看到过两篇类似的文章(发生在不同的数据库上),但基本上,它们给出了类似的解决方法:

  • 有一个站点,比如,建议我们修改DB表的列,以使用基本数据类型而不是自定义数据类型。我们通过将列名称的数据类型更改为
    image
    来实现这一点。一旦完成此操作并重新启动服务器,错误就会消失。然而,它并没有解释为什么或者是什么导致了这个问题

  • 建议使用JPA注释“
    @Column(columnDefinition='image”)
    。我们也尝试过,但它似乎对启动没有任何影响(即错误仍然发生)

  • 在与#2相同的链接中,有人建议扩展SQL方言。然而,我认为这是不可行的-只有2个自定义数据类型(image和tinyint)似乎在我们这方面造成了问题,所以这可能有点过头了

  • 建议从persistence.xml中删除
    hibernate.hbm2ddl.auto=validate
    。我们没有尝试过这一点,因为我们需要进行验证

  • 改用数据类型“LOB”

  • 自从在这里抛出异常以来,我还尝试签出了Hibernate的代码-
    org.Hibernate.mapping.Table.validateColumns(Table.java:261)
    ,这几乎指向这一行:

    boolean typesMatch = (col.getSqlType(dialect, mapping).startsWith(columnInfo.getTypeName().toLowerCase())) || (columnInfo.getTypeCode() == col.getSqlTypeCode(mapping));
    
    然而,Hibernate的API文档有点缺乏细节,所以我现在在跟踪这方面有点困难

    你知道是什么导致了异常吗?如果它在旧版本中工作,我们想知道Hibernate(或Sybase)中的哪些更改会导致这种情况

    文档表明Hibernate是针对Sybase 15.7进行测试的,所以我不知道该在哪里继续查找。上面的#1是最好的解决办法吗?如果是这样的话,你知道为什么应该使用基类型而不是自定义数据类型吗(这在本质上会使自定义数据类型变得无用…)

    再次提前感谢

    编辑

    尝试了以下操作:

  • 如果使用了
    @Column(columnDefinition='my_custom_datatype')
    ,则错误消失
  • 如果从persistence.xml中删除了
    hibernate.hbm2ddl.auto=validate
    ,错误就会消失

  • 我真的怀疑这是一个hibernate问题…

    这与我上面查询中的代码中的
    typesMatch
    性质相似,因为
    col
    columnInfo
    返回的值不同-一个返回基本数据类型,另一个返回自定义用户类型

    因此,为了解决这个问题,有许多变通方法是可能的(我在上面的帖子中也提到过)-

  • 如果可以,请删除hibernate.hbm2ddl.auto=validate
  • 直接在DB中更改列数据类型,我认为这是下一个最快的方法
  • 在Java类中使用
    @Column(columnDefinition='my_custom_datatype')

  • 如果您使用@DiscriminatorColumn,请记住也放在那里。 像这样:

    @DiscriminatorColumn(name = "MyTableName", discriminatorType = DiscriminatorType.STRING, columnDefinition = "char")
    
    并进入属性

        @Column(name="MyColumnName",nullable = true, insertable = true, updatable = true, length = 1, columnDefinition = "char")
        private String type;