NHibernate Hilo Sequence without NHibernate

本文关键字:NHibernate without Hilo Sequence | 更新日期: 2023-09-27 18:07:15

我有一个使用NHibernate将实体保存到数据库的应用程序,它使用NHibernate的HiLo生成来创建id。我有另一个应用程序,我需要将数据保存到同一个表,但在这个应用程序中,我不使用NHibernate。有没有一种简单的方法来使用HiLo而不添加对NHibernate和映射文件的引用?

<id name="EntityId" unsaved-value="0" >
    <column name="EntityId" sql-type="int" not-null="true" />
    <generator class="hilo">
    <param name="table">hibernate_unique_key</param>
        <param name="column">next_hi</param>
        <param name="max_lo">1000</param>
    </generator>
</id>

更新:我创建了一个新方法来获取下一个id,我认为它具有与NHibernate HiLo序列相同的行为。我没有在数据库上加任何锁,所以如果我要插入的是一个高频表,这可能是一个问题,但对于低频表,并发问题的可能性非常低。

/// <summary>
/// Gets the next entity id.
/// </summary>
/// <returns></returns>
public static int GetNextAvailableEntityId()
{
    int max_lo = 1000;
    int nextHi = DefaultContext.Database.SqlQuery<int>("select next_hi from hibernate_unique_key").Single();
    int nextRangeStart = max_lo * nextHi;
    int currentMax = DefaultContext.Database.SqlQuery<int>("SELECT MAX(entityid) FROM Entities").Single();
    if (currentMax < nextRangeStart)
    {
        return currentMax + 1;
    }
    else
    {
        DefaultContext.Database.ExecuteSqlCommand("update hibernate_unique_key set next_hi = next_hi + 1");
        return nextHi;
    }
}

NHibernate Hilo Sequence without NHibernate

如果有疑问,请查看NH的代码,以确保您正确实现了它。

是这样的:

  • 打开一个单独的事务,增加并读取下一个高值,提交
  • 通过next_high * 1000 + x创建1000个id
  • 当id用完时,重新开始

您可以为同一进程的所有事务创建id生成器的单个实例。确保你的id生成器是线程安全的