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
- 自定义数据类型:TYPE1,基本数据类型:image
- 自定义数据类型:TYPE2,基本数据类型:tinyint
CREATE TABLE y (
our_column_name TYPE1,
...
);
服务器启动时,我收到以下错误消息:
。。。
javax.persistence.PersistenceException:
org.hibernate.hibernate异常:列类型错误:我们的列名称,
预期:图像
这不是旧设置中发生的情况。请注意,在我们定义的所有自定义数据类型中,只有那些带有image和tinyint的数据类型有问题;其他的被识别并且不会抛出错误
我们在JConnect驱动程序上运行了一个跟踪,它似乎正在检索正确的数据类型,这就是我现在关注HibernateeException的原因。我看到过两篇类似的文章(发生在不同的数据库上),但基本上,它们给出了类似的解决方法:
image
来实现这一点。一旦完成此操作并重新启动服务器,错误就会消失。然而,它并没有解释为什么或者是什么导致了这个问题@Column(columnDefinition='image”)
。我们也尝试过,但它似乎对启动没有任何影响(即错误仍然发生)hibernate.hbm2ddl.auto=validate
。我们没有尝试过这一点,因为我们需要进行验证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')
,则错误消失hibernate.hbm2ddl.auto=validate
,错误就会消失我真的怀疑这是一个hibernate问题…这与我上面查询中的代码中的
typesMatch
性质相似,因为col
和columnInfo
返回的值不同-一个返回基本数据类型,另一个返回自定义用户类型
因此,为了解决这个问题,有许多变通方法是可能的(我在上面的帖子中也提到过)-
@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;