我是我的表格中的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
答案 0 :(得分:0)
原因可能是:
此序列和此表已经是使用perother app
您是否保证其他应用使用相同的序列SEQ_HGCTRAMITES
来生成主键,与Hibernate相同?
默认情况下,Hibernate会希望序列增加50,并使用n-50
到n
中的数字来填充id,其中n
是由@SequenceGenerator(..., incrementBy = 1)
生成的最后一个值序列。
例如,如果您知道另一个应用程序希望序列增加1,并且只使用连续ID的最后一个序列值,则应使用nextval
来模拟该行为。为了摆脱目前的困境,您还需要转发序列,以便两个应用都不会尝试使用表中已存在的ID(您只需继续从序列中选择incrementBy
,直到它变大为止比任何已存在的身份)。
如果两个应用程序都使用JPA,那么保持.format
参数同步应该可以解决问题(尽管有关转发序列的部分仍然有效)。