2016-05-29 86 views
5

我想插入到我的postgresql使用Hibernate和Java EE的新記錄。休眠:重複鍵值違反唯一約束

這是我的模型:

@Entity 
@SuppressWarnings("serial") 
@Inheritance(strategy=InheritanceType.JOINED) 
public class BaseDesign implements Serializable { 

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

    @Version 
    @Column(name = "version") 
    private int version; 

    @Expose 
    @Column(name = "name") 
    private String name; 

    // getter and setter 
} 

這裏是我的import.sql

INSERT INTO basedesign (id, name, version) VALUES (1, 'China', 0); 

當我建立的代碼,該記錄將加入到數據庫。

然而,當我嘗試添加使用EntityManager的一個新的記錄,像這樣:

BaseDesign design = new BaseDesign(); 
design.setName("USA");     
em.persist(design); 

我:

Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "basedesign_pkey" 
    Detail: Key (id)=(1) already exists. 

的第二次執行相同的命令,它的成功。

爲什麼Hibernate不會在第一次增加起始ID?以及如何配置它從最後一個插入的整數開始?

回答

7

當您在Postgresql中創建bigserial列時,您的文件爲are actually creating a sequence。當您手動插入標識值爲'1'時,Postgresql不會更新序列以將其考慮在內。 Hibernate允許Postgresql使用序列來生成ID,但生成的第一個值是'1',它會發生衝突。第二個值很好。

如果創建轉到後面Hibernate和直接使用SQL的問題,您應該修復它以同樣的方式:use ALTER SEQUENCE to set the next value

alter sequence basedesign_id_seq restart with 2; 
+0

所以這個解決方案必須已知數量的分配呢?它不能自動拾取最後一個ID? – VHanded

+1

問題是您的SQL插入語句手動插入了一個ID。系統可以自動提取ID,前提是您始終*讓系統生成ID並且永遠不會爲ID列提供值。 –

+0

謝謝。我試圖實現的是備份和恢復。當我從DB生成一個轉儲文件時,它帶有帶有ID的INSERT語句。由於該ID不是由DB生成的,因此導致了上述問題。 – VHanded

相關問題