HibernateException:错误的列类型:x,期望:y在Sybase上

cal*_*e16 2 java sybase hibernate

我对下面的技术没有太多背景知识,所以任何帮助都会受到赞赏.如果不清楚,请随时提问.

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

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

现在,我们的应用程序部署在JBoss 4.x上并使用Hibernate 3.2.4.sp1.在旧的DB中,我们有许多自定义数据类型看起来像这样(对不起,本来喜欢把它放在表格格式中,但我不知道如何在这里......):

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

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

CREATE TABLE y (
   our_column_name TYPE1,
   ...
);
Run Code Online (Sandbox Code Playgroud)

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

... javax.persistence.PersistenceException:org.hibernate.HibernateException:错误的列类型:our_column_name,expected:image

这不是旧设置中发生的事情.请注意我们定义的所有自定义数据类型,只有那些带有imagetinyint的数据类型存在问题; 其他人被认可,并没有错误.

我们在JConnect驱动程序上运行了跟踪,看起来它正在检索正确的数据类型,这就是为什么我现在专注于HibernateException.我见过几个与此类似的帖子(发生在不同的DB上),但基本上,他们给出了类似的解决方法:

  1. 这样的一个站点,建议我们改变DB表的列以使用基本数据类型而不是自定义数据类型.我们通过将our_column_name的数据类型更改为来完成此操作image.完成此操作并重新启动服务器后,错误就会消失.但是,它没有解释导致问题的原因或原因.

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

  3. 在与#2相同的链接中,建议扩展SQL Dialect.但是,我不认为这是可行的 - 只有2个自定义数据类型(图像和tinyint)似乎导致我们的问题,所以这可能是矫枉过正.

  4. 此站点建议hibernate.hbm2ddl.auto=validate从persistence.xml中删除.没有尝试过,因为我们需要验证到位.

  5. 请改用数据类型"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));
Run Code Online (Sandbox Code Playgroud)

但是,Hibernate的API文档有点缺乏细节,所以我现在在跟踪这个问题时遇到了一些困难......

什么导致异常的任何想法?如果它在旧版本中工作,那么想知道Hibernate(或者Sybase)的哪些变化会导致这种情况发生?

文档表明Hibernate已针对Sybase 15.7进行了测试,因此我无法继续寻找.上面#1会是最好的解决方法吗?如果是这样,那么应该使用基本类型的任何想法而不是自定义数据类型(实质上,这会使自定义数据类型无效...)

再次感谢您!

编辑:

尝试以下方法:

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

我真的怀疑这是一个休眠问题......

cal*_*e16 7

这在本质上是类似的SO这个问题,typesMatch在我的查询上面的代码会是假的,因为返回的值colcolumnInfo不同-一个是返回基本数据类型,另一种是返回自定义用户类型.

因此,要处理它,可能有许多变通方法(我在上面的帖子中已经提到过) -

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