【发布时间】:2011-04-15 02:08:31
【问题描述】:
我正在从事一个项目,其目标是将现有应用程序转换为 SQL Server。但是,我遇到了 ID 生成问题 - 特别是数据类型的转换。
我的ID列的hibernate注解如下:
@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;
}
此表的此 ID 列映射到 varchar(50),而 $SSMA_seq_SEQ_EXAMPLE_ID 映射到具有单个 id 列且数据类型为 numeric(38,0) 的表。
当我尝试插入(通过创建 Java 对象并将其持久化)时,我得到以下异常:com.microsoft.sqlserver.jdbc.SQLServerException: Error converting data type varchar to numeric。
从概念上讲,numeric(38,0) 适合 varchar(50) 是有道理的,但似乎 SQL Server implicit conversion 在这种情况下不起作用。不幸的是,此时更改数据库定义不是一种选择。
是否有任何全局设置会强制在休眠或 SQL Server 中进行这种转换?因为我使用 hibernate 来生成 ID,所以在将该对象提交到数据库之前,我对生成的用于获取 ID 的 SQL 没有太多控制。
【问题讨论】:
-
从错误消息来看,问题似乎不是将 NUMERIC(38, 0) 拟合到 VARCHAR(50) 中。看起来情况正好相反——试图将 VARCHAR(50) 转换为 NUMERIC(38, 0)。
-
另外请注意,如果您的 SQL Server 中有 IDENTITY 列,则在大多数情况下基本上不应该插入显式值。 (并且 SSMA 有一些逻辑可以将 Oracle 序列使用转换为 SQL Server IDENTITY,但您必须在 SSMA 中进行配置)
标签: sql-server hibernate sql-server-2008