当前位置: 首页 > 知识库问答 >
问题:

HibernateeException:列类型错误:x,Sybase上应为y

刘弘济
2023-03-14

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

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

  1. 赛贝斯-从12. x到15.7
  2. JConnect-从几个版本到7.0.7_SP130

现在,我们的应用程序部署到JBoss 4. x上,并使用Hibernate3.2.4.sp1。在旧的DB中,我们有许多自定义数据类型,看起来像这样(抱歉,很想把它放在表格式中,但我不知道如何在这里...):

  • 自定义数据类型:TYPE1,基本数据类型:图像
  • 自定义数据类型:TYPE2,基本数据类型:tinyint

DDL中的某些列使用自定义数据类型:

CREATE TABLE y (
   our_column_name TYPE1,
   ...
);

当服务器启动时,我得到以下错误消息:

... javax。坚持不懈PersistenceException:org。冬眠HibernateeException:错误的列类型:我们的列名称,应为:image

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

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

>

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

在与#2相同的链接中,有人建议扩展SQL方言。然而,我认为这是不可行的——只有两种自定义数据类型(图像和tinyint)似乎会导致我们这边的问题,所以这可能是过度的。

该网站建议删除hibernate。hbm2ddl。自动=从持久性验证xml。我们还没有尝试过,因为我们需要验证。

改用数据类型“LOB”

自从在这里抛出异常以来,我还尝试检查了Hibernate的代码-org。冬眠地图。桌子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是最好的解决方法吗?如果是这样的话,你知道为什么应该使用基类型而不是自定义数据类型(这在本质上会使自定义数据类型变得无用…)

再次提前感谢!

编辑:

尝试了以下操作:

  1. 如果使用了@Column(columnDefinition='my_custom_datatype'),则错误消失
  2. 如果Hibernate。hbm2ddl。自动=验证从持久性中删除。xml,错误就会消失

我真的怀疑这是冬眠的问题。。。

共有2个答案

段干恺
2023-03-14

如果你使用@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;
史朗
2023-03-14

这在本质上与上一个问题类似,因此我上面查询的代码中的typesMatch将为false,因为colcolumnfo返回的值不同——一个返回基本数据类型,另一个返回自定义用户类型。

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

  1. 删除hibernate。hbm2ddl。如果可以,自动=验证
 类似资料:
  • 我正在尝试使用Spring Security在应用程序中实现基于DAO的身份验证。 当我试图登录到应用程序与用户我得到了这个错误: 看着@jcmwright80对这个问题的回答,我明白了我最好将类注释为。完成此操作后,我在登录时出错: 这似乎是一个与在UserDetailsServiceImpl上创建的代理对象相关的问题-我如何才能优雅地解决这个问题? 密码 安全配置的相关部分: UserDeta

  • 我在这段代码上得到这个错误! 错误:无法将预期类型(integer->integer->Integer)->(integer->Integer)->integer->Integer'与实际类型Integer匹配

  • 问题内容: 我已经调试了一段时间,我希望有人可以在这里阐明一些信息。 我有一个使用JDK 1.6添加到Jenkins中的Maven项目。我在这个项目中使用AOP来处理数据库事务。 当我在Jenkins中运行构建时,我的测试用例失败,出现以下异常: 本类看起来是这样的: - 是具有多种实现的接口。 我可以在IDE中执行代码而不会出现问题。为了确定是Maven问题还是Jenkins问题,我使用命令行导

  • 问题内容: 我已经调试了一段时间,我希望有人可以在这里阐明一些信息。 我有一个使用JDK 1.6添加到Jenkins中的Maven项目。我在这个项目中使用AOP来处理数据库事务。 当我在Jenkins中运行构建时,我的测试用例由于以下异常而失败: 本类看起来是这样的: 是具有多种实现的接口。 我可以从IDE中执行代码而不会出现问题。为了确定是Maven问题还是Jenkins问题,我使用命令行导航到

  • 我已将TS添加到我的React/Redux应用程序中。 我在我的应用程序中使用对象,如下所示: TS抛出一个错误: 类型脚本错误:类型“窗口”上不存在属性“FB”。TS2339 我想修正这个错误。 我在这里找到了答案https://stackoverflow.com/a/56402425/1114926 为什么第一个版本不起作用,而第二个版本起作用,尽管我根本没有指定FB属性?

  • //我正在尝试此代码,但它没有添加到firebase //它给出了这些错误 处理手势时引发了以下_TypeError:类型“List”不是类型“String”的子类型 抛出异常时,这是堆栈:#0个SharedReferences。getString(包:共享首选项/共享首选项。dart:98:35)#1 CheckItemInNot(包:e_shop/Store/storehome.dart:33