有一个实体 Score,其中 record_id自动递增
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "record_id", unique = true, nullable = false)
public Integer getRecordId() {
return recordId;
}
但某些操作可能会出现错误
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Score record = new Score();
try {
session.save(record);
} catch (ConstraintViolationException e) { ...
问题是错误时 record_id 计数器内部增量 在下一次成功的保存操作中,数据库中的行之间存在间隙,例如,其中 69 和 71 是成功操作时写入的内容,但在 70ts 上出现错误。
69 1 6 2016-12-03
71 2 6 2016-12-03
有没有办法防止错误增加?
最佳答案
没有办法避免这种情况,但你也不应该在意。
序列上的增量是一种单向操作。这样做是为了性能。递增序列必须是原子操作,因为多个进程可能需要同时插入行,这需要交错 ids。
在插入爆炸或有人手动执行某些操作占用某些 id 或多种原因的情况下,预计会出现 id 间隙。您无法完全阻止它。
重要的是,您的应用程序不应该关心间隙。自动递增键是一个代理键,不应依赖其值作为任何特定值。如果你的系统需要连续的 id,那就是一种设计味道。
关于java - 如何防止异常时自动递增?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40948033/