2017-05-27 82 views
0

現有序列的Postgres我配置已經存在與JPA 2.1和Spring 4.3

@Id 
@SequenceGenerator(name = "contacto_generator", sequenceName = "commons.contacto_sequence") 
@GeneratedValue(strategy = GenerationType.AUTO, generator = "contacto_generator") 
private Long id; 

我有註解,因爲我是在舊的應用程序數據庫指向實體。

當我升級的實體是好的,但是當我創建一個新的實體,順序不能很好地工作

序列「commons.contacto_sequence」是在509

我甚至激活「 show_sql」並運行:

select nextval ('commons.contacto_sequence') 

如果我直接在數據庫中運行它,它會完全

Caused by: org.postgresql.util.PSQLException: ERROR: llave duplicada viola restricción de unicidad «pk_contacto» 
Detail: Ya existe la llave (id)=(459). 

我不知道那裏的459值,並在我的數據庫沒有序列具有價值

如果你看一下序列的名稱帶有生僻字控制檯

我不知道這是什麼可以或應該改變,因爲理論上來說應該是自動做Spring的東西。

如果這是因爲註釋已被棄用,並且不能很好地連接到序列或者可以。

該項目JPA 2.1,春季版本4.3.x

+1

使用GenerationType.SEQUENCE策略:@GeneratedValue(策略= GenerationType.SEQUENCE,發電機=「contacto_generator 「) – adyjr

+0

正如@adyjr所說,你必須使用SEQUENCE策略,因爲這是保證你的序列被使用的唯一方法。其次,也許如果您查看了所調用的SQL以及數據庫中的實際內容,您可能會找到答案(即調試)。如果它有一個重複的鍵,那麼該鍵已經存在於實體表中,那麼next_val的順序是什麼? –

+0

數據庫有一個數據字典。一組包含數據庫本身信息的表。這應該包括序列。您應該可以使用它來查找所有序列及其當前值。 –

回答

0

嘗試使用GenerationType.SEQUENCE策略:

@Id 
@SequenceGenerator(name = "contacto_generator", sequenceName = "commons.contacto_sequence") 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "contacto_generator") 
private Long id; 
+0

我這樣說,但它仍然犯了同樣的錯誤。 – Jose