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

时间:2015-03-05 10:43:47

标签: java mysql hibernate spring-mvc

我正在为我的应用程序使用SpringMVC + Hibernate + Mysql组合

我从一开始就遇到一个问题 -

"在我的应用程序中,一些具有自动增量功能的表使用Hibernate添加。当我删除任何记录时,从那个tble中添加,然后当我再插入一些时,我没有得到正确的序列&# 34;

例如。 假设我的表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
}

所以在我的情况下,当我删除任何Outlet(POJO)行时,通过应用程序使用Hibernate session.delete()函数"或直接" SQL删除查询",我在这两种情况下都失去了序列。 需要一些建议可以在这里做些什么来避免这种情况。

感谢

1 个答案:

答案 0 :(得分:2)

自动增量不保证顺序编号。这不是它的目的。其目的是以最负载效率的方式提供唯一性,因此它将始终返回最高可用数量 您想要回收的ID可能已被其他行使用,并试图提供一些机制来应对它并非那么简单。
事实上,你应该考虑你的代理键,它们的意思是:没有其他语义的唯一标识符。如果您需要一些顺序编号,您可以自由编写自定义逻辑并将其应用于(最好)一些额外的列。

另见this