Oracle-> MSSQL:如何设置标识符生成器?

时间:2018-02-07 06:53:41

标签: java sql-server hibernate

我正在将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

2 个答案:

答案 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”。或者,您必须开始急切地初始化您的实体和关联。

     

了解详情:http://javarevisited.blogspot.com/2014/04/orghibernatelazyinitializationException-Could-not-initialize-proxy-no-session-hibernate-java.html#ixzz56ahBmiBl