Oracle SequenceGenerator未使用databasesequence的下一个值

Oracle SequenceGenerator未使用databasesequence的下一个值,oracle,hibernate,sequence,Oracle,Hibernate,Sequence,我的申请有问题。我有一个Oracle数据库,表上有一个序列。当我查看数据库中的序列时,它显示最后一个_编号是33800。但是,当我尝试从应用程序中插入新对象时,生成的id不是33800,而是一个较小的数字。我的猜测是Hibernate或其他任何东西只会找到下一个可用的号码。我的应用程序确实会删除表中的行,从而导致id序列中出现漏洞。所以,最终我会得到一个异常,因为我试图插入的ID已经被使用了 如何配置应用程序,使其始终是使用的序列的最后一个数字+1?我认为这是默认行为,因为我不记得遇到过这个问题

我的申请有问题。我有一个Oracle数据库,表上有一个序列。当我查看数据库中的序列时,它显示最后一个_编号是33800。但是,当我尝试从应用程序中插入新对象时,生成的id不是33800,而是一个较小的数字。我的猜测是Hibernate或其他任何东西只会找到下一个可用的号码。我的应用程序确实会删除表中的行,从而导致id序列中出现漏洞。所以,最终我会得到一个异常,因为我试图插入的ID已经被使用了

如何配置应用程序,使其始终是使用的序列的最后一个数字+1?我认为这是默认行为,因为我不记得遇到过这个问题

这是我的实体:

@实体
@SequenceGenerator(name=“SequenceIdGenerator”,sequenceName=“MY_SEQ”,allocationSize=20)
@表(name=“myEntity”)
公共类myEntity{
私人长id;
@身份证
@列(name=“id”)
@GeneratedValue(generator=“SequenceIdGenerator”)
公共长getId(){
返回id;
}
公共无效集合id(最终长id){
this.id=id;
} 
}


您可以让hibernate通过

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

你可以在这里了解更多


您正在使用ORACLE,因此对于您来说,
GenerationType。序列将作为
GenerationType工作。ORACLE不支持标识
您可以让hibernate通过

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

你可以在这里了解更多


您使用的是ORACLE,因此对于您来说,
GenerationType。序列
将作为
GenerationType工作。ORACLE不支持标识

数据库中定义的ORACLE序列不能保证您将获得最后一个最高数字+1。它们不是那样工作的,你很可能会在序列中出现空白。然而,它不应该倒退,除非它已经循环或被重新创建。嗯,那么为什么它可能会倒退呢。据我所知,我还没有循环或重新创建序列。我所经历的行为对我来说似乎有点奇怪。你可能因为配置Hibernate的方式而增加了错误的序列吗?这是ORM的缺点之一;事情隐藏在幕后,隐藏了简单数据库调用的简单性。数据库中定义的Oracle序列不能保证您将获得最后一个最高数字+1。它们不是那样工作的,你很可能会在序列中出现空白。然而,它不应该倒退,除非它已经循环或被重新创建。嗯,那么为什么它可能会倒退呢。据我所知,我还没有循环或重新创建序列。我所经历的行为对我来说似乎有点奇怪。你可能因为配置Hibernate的方式而增加了错误的序列吗?这是ORM的缺点之一;事情隐藏在幕后,隐藏了简单数据库调用的简单性。我可以尝试,但这如何处理使用旧sequencegenerator创建的实体?您可以在这里了解更多信息,我可以尝试,但是,这如何与已经使用旧sequencegenerator创建的实体协同工作呢?您可以在这里阅读更多关于它的内容