【发布时间】:2017-12-29 21:03:48
【问题描述】:
我的申请有问题。我有一个在表上有一个序列的 Oracle 数据库。当我在数据库中查看序列时,它说 last_number 是 33800。但是,当我尝试从我的应用程序中插入一个新对象时,生成的 id 不是 33800,而是一个较小的数字。我的猜测是 Hibernate 或其他任何东西都会找到下一个可用的数字。我的应用程序确实会删除表中的行,从而导致 id-sequence 出现漏洞。所以,最终我会得到一个异常,因为我试图插入的 ID 已经被使用了。
如何配置应用程序,使其始终使用序列的最后一个数字 + 1?我认为这是默认行为,因为我不记得遇到过这个问题。
这是我的实体:
@Entity
@SequenceGenerator(name = "SequenceIdGenerator", sequenceName = "MY_SEQ", allocationSize = 20)
@Table(name = "myEntity")
public class myEntity {
private Long id;
@Id
@Column(name = "id")
@GeneratedValue(generator = "SequenceIdGenerator")
public Long getId() {
return id;
}
public void setId(final Long id) {
this.id = id;
}
}
【问题讨论】:
-
数据库中定义的 Oracle SEQUENCE 不能保证您将获得最后的最高数字 +1。它们不是那样工作的,你很可能会在序列中出现空白。但是,它不应该倒退,除非它已经 CYCLEd 或被重新创建。
-
嗯,那它为什么会倒退。据我所知,我没有循环或重新创建序列。我正在经历的行为对我来说似乎有点奇怪。
-
由于 Hibernate 的配置方式,您可能会增加错误的序列吗?这是 ORM 的缺点之一。事情在幕后隐藏和完成,隐藏了简单数据库调用的简单性。