2016-05-29 14 views
5

Próbuję wstawić do nowego rekordu do mojego postgresql przy użyciu Hibernate i Java EE.Hibernate: zduplikowana wartość klucza narusza wyjątkowe ograniczenie

To jest mój model:

@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 
} 

I tu jest moje import.sql

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

Kiedy zbudować kod, rekord jest dodawany do db.

Jednak gdy próbuję dodać nowy rekord używając EntityManager, jak to:

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

mam:

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

Wykonaj tę samą komendę po raz drugi, a to sukces.

Dlaczego funkcja hibernacji nie zwiększa początkowego identyfikatora po raz pierwszy? I jak skonfigurować, aby rozpocząć od ostatniej wstawionej liczby całkowitej?

Odpowiedz

7

Po utworzeniu kolumny bigserial w Postgresql, jesteś are actually creating a sequence. Gdy ręcznie wstawiono wartość identyfikatora równą "1", Postgresql nie zaktualizował sekwencji, aby wziąć to pod uwagę. Hibernate pozwala PostgreSQL używać sekwencji do generowania ID, ale pierwsza wygenerowana wartość to "1", która się koliduje. Druga wartość jest w porządku.

Jeśli utworzono ten problem będzie za Hibernate i stosując bezpośrednio SQL, należy je naprawić w ten sam sposób: use ALTER SEQUENCE to set the next value:

alter sequence basedesign_id_seq restart with 2; 
+0

Więc to rozwiązanie musi przypisać znany numer do niego? Nie może automatycznie odebrać ostatniego identyfikatora? – VHanded

+1

Problemem jest instrukcja wstawiania instrukcji SQL, która ręcznie wstawiła identyfikator. System może automatycznie odbierać identyfikatory pod warunkiem, że * zawsze * pozwala systemowi generować identyfikator i nigdy nie podaje wartości dla kolumny id. –

+0

Dzięki. To, co próbuję osiągnąć, to tworzenie kopii zapasowych i przywracanie. Kiedy generuję plik zrzutu z DB, przychodzi z instrukcją INSERT z identyfikatorem. Ponieważ ten identyfikator nie jest generowany przez DB, spowodował powyższy problem. – VHanded

Powiązane problemy