使用oracle序列和hibernate的ORA-00001

使用oracle序列和hibernate的ORA-00001,oracle,hibernate,jpa,spring-data,spring-data-jpa,Oracle,Hibernate,Jpa,Spring Data,Spring Data Jpa,我正在为我的表生成IDs im的策略: @Entity @Table(name="HGCTRAMITES") @Getter @Setter @SequenceGenerator(name="SEQ_HGCTRAMITES", sequenceName="SEQ_HGCTRAMITES") @ToString public class Tramite { 我的列主键是这样的: @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, g

我正在为我的表生成IDs im的策略:

@Entity
@Table(name="HGCTRAMITES")
@Getter
@Setter
@SequenceGenerator(name="SEQ_HGCTRAMITES", sequenceName="SEQ_HGCTRAMITES")
@ToString
public class Tramite {
我的列主键是这样的:

@Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_HGCTRAMITES")
    private Integer codigo;
此序列和此表已经在使用perother应用程序,此表已经有数据

我使用的是Oracle11g,我的方言hibernate:它是
spring.jpa.database platform=org.hibernate.dialogue.oracle10gDialogue

在日志控制台中,hibernate调用下一个序列的查询,但我收到错误:ORA-00001:restrição exclusiva(HELPDESK.PK_HGCTRAMITES)violada

我的表只有主键的列
codigo

为什么hibernate正在搜索它已存在的id

Hibernate: 
    select
        seq_hgctramites.nextval 
    from
        dual

原因可能是:

此序列和此表已在使用perother应用程序

您是否保证其他应用程序使用与Hibernate相同的顺序生成主键

默认情况下,Hibernate希望序列增加50,并使用从
n-50
n
的数字填充ID,其中
n
是序列生成的最后一个值

例如,如果您知道另一个应用程序希望序列增量为1,并且只对连续ID使用最后一个序列值,那么您应该使用
@SequenceGenerator(…,incrementBy=1)
来模拟该行为。为了摆脱当前的困境,您还需要转发序列,这样两个应用程序都不会尝试使用表中已经存在的id(您只需继续从序列中选择
nextval
,直到它大于任何已经存在的id)

如果两个应用程序都使用JPA,那么保持
incrementBy
参数同步应该可以做到这一点(不过,关于转发序列的部分仍然有效)