我正在为我的应用程序使用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删除查询",我在这两种情况下都失去了序列。 需要一些建议可以在这里做些什么来避免这种情况。
感谢
答案 0 :(得分:2)
自动增量不保证顺序编号。这不是它的目的。其目的是以最负载效率的方式提供唯一性,因此它将始终返回最高可用数量
您想要回收的ID可能已被其他行使用,并试图提供一些机制来应对它并非那么简单。
事实上,你应该考虑你的代理键,它们的意思是:没有其他语义的唯一标识符。如果您需要一些顺序编号,您可以自由编写自定义逻辑并将其应用于(最好)一些额外的列。
另见this