我对以下技术没有太多背景,因此我们将不胜感激。如果有不清楚的地方,请随时提问。
我目前正在开展一个迁移项目,其中我们正在更新许多技术,包括:
- Sybase - 从 12.x 到 15.7
- JConnect - 从多个版本到 7.0.7_SP130
现在,我们的应用程序已部署到 JBoss 4.x 上并使用 Hibernate 3.2.4.sp1。在旧的数据库中,我们有许多看起来像这样的自定义数据类型(抱歉,我很想将其放入表格格式,但我不知道如何放在这里......):
- 自定义数据类型:TYPE1,基本数据类型:图像
- 自定义数据类型:TYPE2,基本数据类型:tinyint
DDL 中的某些列使用自定义数据类型:
CREATE TABLE y (
our_column_name TYPE1,
...
);
当服务器启动时,我收到以下错误消息:
... javax.persistence.PersistenceException: org.hibernate.HibernateException: Wrong column type: our_column_name, expected: image
这不是旧设置中发生的情况。请注意,在我们定义的所有自定义数据类型中,只有 image 和 tinyint 的数据类型存在问题;其他的被识别并且不会抛出错误。
我们在 JConnect 驱动程序上运行了跟踪,看起来它正在检索正确的数据类型,这就是我现在关注 HibernateException 的原因。我看过几篇与此类似的帖子(发生在不同的数据库上),但基本上,他们给出了类似的解决方法:
像this one这样的网站,建议我们更改数据库表的列以使用基本数据类型而不是自定义数据类型。我们通过将 our_column_name 的数据类型更改为
image
来完成此操作。完成此操作并重新启动服务器后,错误就会消失。但是,它没有解释原因或导致问题的原因。This建议使用 JPA 注释的
@Column(columnDefinition='image')
。我们也尝试过这个,但似乎对启动没有任何影响(即错误仍然发生)。在与 #2 相同的链接中,建议扩展 SQL 方言。但是,我认为这是不可行的 - 只有 2 个自定义数据类型(image 和tinyint)似乎导致了我们的问题,所以这可能有点矫枉过正。
This site建议从 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)的哪些变化会导致这种情况?
This文档表明 Hibernate 已针对 Sybase 15.7 进行了测试,因此我不知道在哪里继续寻找。上面的#1 是最好的解决方法吗?如果是这样,为什么应该使用基本类型而不是自定义数据类型(这实际上会使自定义数据类型变得无用......)的任何想法
再次感谢!
编辑:
尝试了以下方法:
- 如果使用
@Column(columnDefinition='my_custom_datatype')
,错误就会消失。 - 如果从 persistence.xml 中删除
hibernate.hbm2ddl.auto=validate
,错误就会消失。
我真的怀疑这是一个 hibernate 问题......
最佳答案
这本质上类似于 this question on SO即上面查询中的代码中的 typesMatch
将为 false,因为 col
和 columnInfo
返回的值不同 - 一个返回基数datatype,另一个是返回自定义用户类型。
因此,为了解决这个问题,可以采取多种解决方法(我在上面的帖子中提到过)-
- 如果可以的话,请删除
hibernate.hbm2ddl.auto=validate
。 - 直接在数据库中更改列数据类型,我认为这是第二快的方法。
- 在 Java 类中使用
@Column(columnDefinition='my_custom_datatype')
。
关于java - 预期 HibernateException : Wrong column type:x,:Sybase 上的 y,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26774193/