使用SQL Server标识列

时间:2015-12-10 11:03:18

标签: java sql-server hibernate

我们正在使用Hibernate 保存方法在具有标识列的 SQL Server表中插入数据。

@GeneratedValue(strategy=GenerationType.AUTO) 
使用

注释,我们能够插入数据,并且标识列也会增加。

  

问题是:如果由于任何原因在表中插入失败,那么标识列的值也会递增。因此,下一次成功插入需要+2值。例如首次成功插入导致Identity列值为1.
  第二次插入失败了。
  第三次成功插入导致标识列值为3而不是2。

这似乎是一个常见问题,因为Hibernate save方法会立即返回生成的id。请建议一个最佳备用解决方案,以便在出现故障时不会增加标识列值。

1 个答案:

答案 0 :(得分:0)

据我所知,此问题的唯一解决方案是您必须通过应用程序明确地为对象分配ID,而不是让hibernate或数据库为您生成。

为了做到这一点,

  1. 在基于注释的方法中,只需删除@GeneratedValue注释,而只使用@Id
  2. 在基于映射文件的方法中,将assign指定为生成器类,例如<generator class="assigned">
  3. 现在:

    1. 创建自己的算法以生成唯一的主键。
    2. 将主键设为intlong而不是serial
    3. 从算法中获取一个数字。
    4. 将其用作对象的ID。