【问题标题】:ID jumping Issue With MSSQL and HibernateMSSQL 和 Hibernate 的 ID 跳跃问题
【发布时间】:2016-02-27 18:34:29
【问题描述】:

MSSQL ID 跳转功能有问题。

我的要求是,我需要生成一个序列号,比如说,从 1000 开始并逐个递增,我的应用程序托管在多个服务器中并指向同一个 DB。多个主机与 Nginx 平衡。

为此,用 SequenceGenerator 写了一个实体类

@Entity
@SequenceGenerator(name = "IdSequence", 
sequenceName = " ID_GEN",  
allocationSize = 1)
public class Example implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;


    @Id
    @GeneratedValue(generator = " IdSequence ")
    private long id ;

}

而且效果很好。当我重新启动DB时,下一个ID跳转到current+1000 为了解决这个问题,我添加了一个休眠属性,它可以很好地防止 ID 跳跃。

<property name="hibernate.id.new_generator_mappings" value="true"/>

现在真正的问题是已经存在的具有自动生成策略的实体出现了异常

无法在表“USER”中为标识列插入显式值 IDENTITY_INSERT 设置为 OFF。

  • 有什么办法可以解决 JPA/Hibernate 中的 ID 跳转问题
  • 我怎样才能避免IDENTITY_INSERT is set to OFF 同样的修复。

您能否建议一个更好的选项来生成序列号 那应该是独一无二的。

提前致谢

【问题讨论】:

    标签: java sql-server spring hibernate jpa


    【解决方案1】:

    听起来您正在经历的是this,而不是与 Hibernate 相关的任何内容。

    在 SQL Server 配置管理器中,右键单击右侧窗格中的实例名称,然后单击属性,然后单击启动参数 在“指定启动参数”中输入-T272,设置272跟踪标志。

    我理解您的困惑和沮丧,但最终,您不必担心您的下一个 identity 值会是什么。

    还有一个封闭的Microsoft Connect 帖子表明这是它与其他一些可能的解决方法的方式。

    【讨论】:

    • 谢谢,我的要求就像 Id 应该是从 1000 开始的序列值,并以 1 递增 1。我认为 JPA/Hibernate 没有问题。但它是 MSSQL 的一项技术,我担心有什么方法可以控制这个
    • 如果这是一项要求,那么一个建议是推出您自己的增量解决方案。创建一个包含整数字段的表。在事务中,插入时,将整数字段加一,然后选择此值用于您的伪身份字段,然后提交。否则——整数数据类型可以超过 20 亿——对于大多数应用程序来说已经足够了。我建议直接使用它,让数据库做它应该做的事情。
    【解决方案2】:

    在 sql server 中,除非在插入语句之前指定 SET IDENTITY_INSERT &lt;yourTableName&gt; ON,否则不能为标识列插入值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多