【问题标题】:SequenceGenerator not using next value of databasesequenceSequenceGenerator 不使用数据库序列的下一个值
【发布时间】: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 的缺点之一。事情在幕后隐藏和完成,隐藏了简单数据库调用的简单性。

标签: oracle hibernate sequence


【解决方案1】:

你可以让hibernate来处理这个

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id", nullable = false)
    private Long id;

你可以在这里阅读更多关于它https://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing

您使用的是 ORACLE,所以 GenerationType.SEQUENCE 将工作,因为 Oracle 不支持 GenerationType.IDENTITY

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-09-17
  • 2019-09-23
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 2015-02-01
  • 1970-01-01
  • 2016-10-28
相关资源
最近更新 更多