我正在将OracleDB11g迁移到MSSQL2014。
当前尝试保存新数据时出现以下错误:
引起:com.microsoft.sqlserver.jdbc.SQLServerException:不能 将值NULL插入列' ID',table' testDB.FILE_SETTINGS&#39 ;; 列不允许空值。 INSERT失败。
我的解释是,这是因为" native" ID生成器在Oracle和Oracle之间有所不同。 MSSQL(序列与身份)。
在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服务器中我有序列(创建了迁移工具):
testDB中的HIBERNATE_SEQUENCE-&gt; Views-&gt; sys.sequences
也可在(创建的迁移工具)中找到:
testDB-&GT;视图 - &GT; INFORMATION_SCHEMA.SEQUENCES
如何正确完成这项工作,因为我希望保留与Oracle中相同的方式来生成身份?在MSSQL或休眠设置中出了什么问题?
Hibernate版本很老了:2.1.8
答案 0 :(得分:1)
您对错误的解释是错误的。此错误不会告诉您有关sequence
的任何信息。它会告诉您,testDB.FILE_SETTINGS
已将id
列定义为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');
无法将值NULL插入列&#39; id&#39;,表中 &#39; db2.dbo.MyTbl_wrong&#39 ;;列不允许空值。 INSERT失败。该 声明已被终止。
您应该做的是在sequence
列的默认值中使用id
,如下所示:
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
答案 1 :(得分:0)
如果某天有人遇到类似问题,请回答自己的问题:
显然我在原始问题中提到的设置没有任何问题,只是hibernate 2.1.8似乎不支持SEQUENCE id genererator。老hibernate显然也不支持所需的SQLServer2012Dialect。
结束将hibernate版本更新到4.3.11(带有依赖项)。这个版本被选中,因为它需要最少量的重构。
我遇到了一些依赖项问题,因为这个旧项目没有使用Maven。
在尝试任何数据库查询时也遇到此错误:
org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话
我发现新的hibernate版本默认使用延迟加载,旧版本不支持。所以我最终在hibernate设置文件中设置了“lazy = false”来修复它。
从hibernate 2.1升级到hibernate 3.0时,您可能会看到“org.hibernate.LazyInitializationException:无法初始化代理 - 无会话”。你会突然发现自己在发生什么事情时感到困惑,它在更新前正在工作。原因是,Hibernate 3引入了延迟加载作为默认值,即lazy =“true”。如果你希望它像以前一样工作,你可以将所有内容标记为lazy =“false”。或者,您必须开始急切地初始化您的实体和关联。