gpt4 book ai didi

java - Oracle->MSSQL : How to set identifier generator?

转载 作者:行者123 更新时间:2023-12-02 11:40:01 26 4
gpt4 key购买 nike

我正在将 OracleDB11g 迁移到 MSSQL2014。

当前在尝试保存新数据时出现以下错误:

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Cannot insert the value NULL into column 'ID', table 'testDB.FILE_SETTINGS'; column does not allow nulls. INSERT fails.

我的解释是,这是由于 Oracle 和 MSSQL 之间的“ native ”ID 生成器不同(序列与标识)而导致的。

在Oracle中,我们对HIBERNATE_SEQUENCE进行了小的定制:

alter sequence hibernate_sequence increment by 5;

...但仅此而已。

hibernate-mapping本来是这样的:

<id name="id" column="ID" type="java.lang.Long">
<generator class="native">
</generator>
</id>

在 MSSQL 中,我尝试过这样的操作,但没有成功:

<id name="id" column="ID" type="java.lang.Long">
<generator class="sequence">
<param name="sequence">HIBERNATE_SEQUENCE</param>
</generator>
</id>

在 MSSQL 服务器中我有序列(创建迁移工具):

HIBERNATE_SEQUENCE in testDB->Views->sys.sequences

还可以在(创建的迁移工具)中找到:

testDB->Views->INFORMATION_SCHEMA.SEQUENCES

由于我想保留与 Oracle 中相同的方式来生成身份,因此应该如何正确完成此操作? MSSQL 或 hibernate 设置有问题吗?

Hibernate 版本相当旧:2.1.8

最佳答案

您对错误的解释是错误的。此错误不会告诉您任何有关序列的信息。它告诉您,您的 testDB.FILE_SETTINGSid 列定义为 NOT NULL 但您尝试插入 NULL 值在这里。

我没有看到你的代码,但我认为有这样的东西:

create table dbo.MyTbl_wrong (id int NOT NULL, col1 varchar(100) );
insert into dbo.MyTbl_wrong(col1) values ('1 str'), ('2 str'), ('3 str');

Cannot insert the value NULL into column 'id', table 'db2.dbo.MyTbl_wrong'; column does not allow nulls. INSERT fails. The statement has been terminated.

您应该做的是在 id 列的默认值中使用 sequence,如下所示:

create sequence dbo.MySeq 
start with 1;

create table dbo.MyTbl (id int NOT NULL default(next value for dbo.MySeq), col1 varchar(100) );

insert into dbo.MyTbl(col1) values ('1 str'), ('2 str'), ('3 str');

--select *
--from dbo.MyTbl;
-------
--id col1
--1 1 str
--2 2 str
--3 3 str

关于java - Oracle->MSSQL : How to set identifier generator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48657665/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com