为 Hibernate 的 HiLo 算法管理的列生成 ID
Generating ID for column managed by Hibernate's HiLo algorithm
情况:
- 现有应用程序使用 NHibernate 与 SQL 服务器数据库交互。所有 table 的 ID 均由 NHibernate 使用其 HiLo 算法生成,并且 table 没有任何身份集(即 GeneratedBy().Hilo("1"))
- 第二个应用程序需要能够(很少)向其中一个 table 添加行,但它需要能够生成一个唯一的 ID,以便与使用 NHibernate 的应用程序很好地配合,无需更改旧应用程序的工作方式
问题:如何复制 NHibernate(可能还有 Hibernate)为了生成其中一个 ID 而经历的过程?我认为这将涉及获取和递增 hibernate_unique_key table.
中的值
这基本上就是我解决问题的方法:
declare @newid int;
set @newid = (select top 1 (@max_lo + 1) * next_hi) from hibernate_unique_key);
update hibernate_unique_key set next_hi = next_hi + 1;
insert into ExampleTable(Id, Column)
values (@newid, @Value);
select @newid;
这是使用 Dapper,并且在交易中
因为在我的例子中 max_lo 只是 1,所以我每次以这种方式插入一行时只 "lose" 1 个 ID
情况:
- 现有应用程序使用 NHibernate 与 SQL 服务器数据库交互。所有 table 的 ID 均由 NHibernate 使用其 HiLo 算法生成,并且 table 没有任何身份集(即 GeneratedBy().Hilo("1"))
- 第二个应用程序需要能够(很少)向其中一个 table 添加行,但它需要能够生成一个唯一的 ID,以便与使用 NHibernate 的应用程序很好地配合,无需更改旧应用程序的工作方式
问题:如何复制 NHibernate(可能还有 Hibernate)为了生成其中一个 ID 而经历的过程?我认为这将涉及获取和递增 hibernate_unique_key table.
中的值这基本上就是我解决问题的方法:
declare @newid int;
set @newid = (select top 1 (@max_lo + 1) * next_hi) from hibernate_unique_key);
update hibernate_unique_key set next_hi = next_hi + 1;
insert into ExampleTable(Id, Column)
values (@newid, @Value);
select @newid;
这是使用 Dapper,并且在交易中
因为在我的例子中 max_lo 只是 1,所以我每次以这种方式插入一行时只 "lose" 1 个 ID