2010-07-08 115 views
0

我正在处理目标是将现有应用程序转换为SQL Server的项目。但是,我遇到了ID生成问题 - 特别是数据类型的转换。SQL Server转换异常:将数据类型varchar转换为数字时出错

用于我的ID列中的休眠注解如下:

@Id 
@GeneratedValue(generator="ID_GEN", strategy=GenerationType.TABLE) 
@TableGenerator(name="ID_GEN", table="[$SSMA_seq_SEQ_EXAMPLE_ID]") 
@Column(name="ID", unique="true", nullable="false") 
public String getId() { 
    return this.id; 
} 

此本表中映射到varchar(50)的ID列,而$SSMA_seq_SEQ_EXAMPLE_ID映射到一个表与数据的类型的单个idnumeric(38,0)

当我尝试插入(通过创建一个Java对象并坚持它),我得到以下异常:com.microsoft.sqlserver.jdbc.SQLServerException: Error converting data type varchar to numeric

从概念上讲,numeric(38,0)适合于varchar(50)是有道理的,但似乎SQL Server implicit conversion在这种情况下不起作用。不幸的是,在这个时候改变数据库定义不是一种选择。

是否有任何全局设置会在hibernate或SQL Server中强制执行此转换?因为我使用hibernate来生成ID,所以在将此对象提交给数据库之前,我无法控制生成的用于获取ID的SQL。

+2

从错误消息看,它看起来不像问题是将NUMERIC(38,0)装入VARCHAR(50)中。看起来反过来 - 尝试将VARCHAR(50)转换为NUMERIC(38,0)。 – 2010-07-08 17:01:18

+0

另请注意,如果您的SQL Server中有IDENTITY列,则在大多数情况下基本上不应插入显式值。 (并且SSMA有一些逻辑可以将Oracle序列用法转换为SQL Server IDENTITY,但是您必须在SSMA中配置它) – IgorK 2011-02-02 11:08:15

回答

0

我最终编写了一个假定已知数据类型并进行了转换的自定义生成器。详情请参阅this

相关问题