ORA-00001使用oracle序列和hibernate

时间:2018-06-05 11:16:19

标签: oracle hibernate jpa spring-data spring-data-jpa

我是我的表格中的ID生成策略:

@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 app,这个表已经有了数据。

我使用的是Oracle 11g,我的方言是hibernate:它是spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect

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

我的表只有主键codigo

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

Hibernate: 
    select
        seq_hgctramites.nextval 
    from
        dual

1 个答案:

答案 0 :(得分:0)

原因可能是:

  

此序列和此表已经是使用perother app

您是否保证其他应用使用相同的序列SEQ_HGCTRAMITES来生成主键,与Hibernate相同

默认情况下,Hibernate会希望序列增加50,并使用n-50n中的数字来填充id,其中n是由@SequenceGenerator(..., incrementBy = 1)生成的最后一个值序列。

例如,如果您知道另一个应用程序希望序列增加1,并且只使用连续ID的最后一个序列值,则应使用nextval来模拟该行为。为了摆脱目前的困境,您还需要转发序列,以便两个应用都不会尝试使用表中已存在的ID(您只需继续从序列中选择incrementBy,直到它变大为止比任何已存在的身份)。

如果两个应用程序都使用JPA,那么保持.format参数同步应该可以解决问题(尽管有关转发序列的部分仍然有效)。