当前位置: 首页 > 知识库问答 >
问题:

删除和插入后会丢失Hibernate自动增量序列

胥康安
2023-03-14

我的应用程序使用SpringMVC+Hibernate+MySQL组合

我从一开始就纠结于一个问题-

“在我的应用程序中,有些表使用Hibernate添加了自动递增功能.因此,当我删除任何记录时,当我再次插入一些记录时,我没有得到正确的顺序.”

为。假设我的表ABC最初有100条记录(例如,abc_id的主键具有从1到100的正确顺序的值)。

当我删除。50个记录,再插入50个记录,但这个时间序列,我得到的是从101开始,即使我有同样的100个记录。所以我需要记录应该从最后一个Id值开始,也就是从51到100。因此,在这种情况下,我的表会丢失序列,这在我的应用程序中是非常常见的情况。

下面是我的POJO设计

@Entity
@Table(name = "outlet_info", catalog = "secondary_sales")
public class OutletInfo implements java.io.Serializable {
    // Fields
    private static final long serialVersionUID = 7915773659216514833L;
    private Integer outletId;//autoIncrement fields
    private String outletTypeInfo;
    private String outletName;
    private String outletGrade;

    // Constructors

    /** default constructor */
    public OutletInfo() {
    }

    @Id
    @GenericGenerator(name="generator", strategy="increment")
    @GeneratedValue(generator="generator")
    @Column(name = "outlet_id", unique = true, nullable = false)
    public Integer getOutletId() {
        return this.outletId;
    }

    public void setOutletId(Integer outletId) {
        this.outletId = outletId;
    }

    //other getters and setters
}

因此,在我的例子中,当我“通过应用程序使用Hibernate session.delete()函数”或直接“SQL delete Query”删除任何Outlet(POJO)行时,我在这两种情况下都丢失了序列。需要一些建议,在这里可以做什么,以避免这种情况。

谢谢

共有1个答案

夹谷浩宕
2023-03-14

自动递增不保证顺序编号。这不是它的目的。它的目的是以最有效的负载方式提供唯一性,因此它将始终返回可用的最高值。
您要回收的ID可能已经被其他行使用过,并且试图提供某种机制来处理它并不那么简单。
实际上,您应该将代理键视为它们的本意:没有其他语义的唯一标识符。如果您想要一些顺序编号,您可以自由地编写您的自定义逻辑,并将其应用到(最好)一些附加列。

另见此

 类似资料:
  • 我正在使用java中的MySQL库执行一个查询。在我的数据库结构中,有一列名为(主键,非空且自动递增)。通常在每次插入查询中,我都将值设置为,在查询执行后,它会增加最后一个id,但在java中这样做会给我异常。 这就是代码: 如何使用自动增量ID执行查询?

  • 问题内容: 我正在寻找这样的查询: id | int | 自动增量 varchar | 255 这样桌子就看起来像 1 | val1 2 | val2 3 | val3 … 除了id总是以每一行都结束而已。 我怎样才能做到这一点? 问题答案:

  • 问题内容: 我有一个带有主键字段且具有AUTO_INCREMENT的MySQL表。在阅读了这里的其他文章后,我发现人们遇到了同样的问题,答案也各不相同。有些人建议不要使用此功能,其他人则说它不能被“修复”。 我有: 示例:表中的记录数:18.如果我删除记录16、17和18-我希望输入的下一条记录的courseID为16,但是由于最后输入的courseID为18,所以它将为19。 我的SQL知识不是

  • 问题内容: 当我从用户那里接收数据时,我每次都会验证输入的格式(PHP)。我唯一无法验证(或我不想)的是约束(例如外键)违规。我让DML引发并出错,并让数据库驱动程序引发异常。捕获它后,我只是通过MySQL的错误代码打印出一些错误消息。 问题是,即使插入失败,我仍然看到序列还在增长。我该如何预防呢? 问题答案: 这就是自动增量值和序列的工作方式。使用值时,如果事务失败,则不会回收该值,并且会回滚该

  • 问题内容: 我生成一个SQLite表(在Java中): 之后,我尝试使用INSERT命令添加行: 我得到错误: 我以为行ID会自动生成,但似乎我什么都没想。 我尝试了另一种解决方案: 结果,我在“ prep.setInt(1,n);”处收到一个空指针异常。 看到故障了吗? 问题答案: 您是否尝试指出要传递的参数应该与表的哪些字段相关? 在您的情况下,可能类似于:

  • 我有一个表,我试图插入新行,但有一个列不会自动递增自己。有没有办法编写一个INSERT命令,根据列中的最高值自动递增该列?