2015-06-17 6 views
2

У меня есть следующая проблемаHibernate - дубликат ключа нарушает ограничение уникальности

@Entity 
@Table(name="tb_pessoa", schema="public") 
@Inheritance(strategy = InheritanceType.JOINED) 
public class Pessoa implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @SequenceGenerator(name = "tb_pessoa_id_seq", sequenceName = "tb_pessoa_id_seq", schema="public") 
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "tb_pessoa_id_seq") 
    @Column(name = "id", nullable = false) 
    private Integer id; 

    ... 

@Entity 
@Table(name="tb_pessoafisica", schema="public") 
@PessoaFisicaAnnotation 
@PrimaryKeyJoinColumn(name = "id") 
public class PessoaFisica extends Pessoa implements Serializable { 
    private static final long serialVersionUID = 1L; 

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

    ... 

Предполагая таблицу Пессоа имеет записей ID 1 до 500. Когда я запускаю код ниже:

PessoaFisica pessoaFisica = new PessoaFisica(); 
pessoaFisica.setEmail("[email protected]"); 

... 

em.persist(pessoa); 

Это произошло нг следующее сообщение об ошибке:

17:26:13,613 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http--10.36.1.49-8180-1) ERROR: duplicate key value violates unique constraint "tb_pessoa_pkey" 
    Detalhe: Key (id)=(438) already exists. 
17:26:13,614 WARN [com.arjuna.ats.arjuna] (http--10.36.1.49-8180-1) ARJUNA012125: TwoPhaseCoordinator.beforeCompletion - failed for SynchronizationImple< 0:ffff7f000101:-7f6ae4e3:558080ed:4f, org.hibernate.engine[email protected]331af73a >: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: ERROR: duplicate key value violates unique constraint "tb_pessoa_pkey" 
    Detalhe: Key (id)=(438) already exists. 

почему пытается использовать идентификатор , а не ???

Кто-нибудь знает, что может случиться?

спасибо

CREATE TABLE tb_pessoa 
(
    id integer NOT NULL, 
    CONSTRAINT tb_pessoa_pkey PRIMARY KEY (id) 
) 

CREATE TABLE tb_pessoafisica 
(
    email character varying(64) NOT NULL, 
    CONSTRAINT tb_pessoafisica_pkey PRIMARY KEY (id), 
    CONSTRAINT fkee8c050f70415778 FOREIGN KEY (id) 
     REFERENCES tb_pessoa (id) MATCH SIMPLE 
) 

CREATE SEQUENCE tb_pessoa_id_seq 
    INCREMENT 1 
    MINVALUE 1 
    MAXVALUE 9223372036854775807 
    START 500 
    CACHE 1; 

Вход Hibernate:

07:50:52,463 INFO [stdout] (http--10.36.1.49-8180-2) Hibernate: 
07:50:52,463 INFO [stdout] (http--10.36.1.49-8180-2)  select 
07:50:52,464 INFO [stdout] (http--10.36.1.49-8180-2)   nextval ('public.tb_pessoa_id_seq') 
07:50:52,497 INFO [stdout] (http--10.36.1.49-8180-2) Hibernate: 
07:50:52,498 INFO [stdout] (http--10.36.1.49-8180-2)  insert 
07:50:52,499 INFO [stdout] (http--10.36.1.49-8180-2)  into 
07:50:52,499 INFO [stdout] (http--10.36.1.49-8180-2)   public.tb_pessoa 
07:50:52,500 INFO [stdout] (http--10.36.1.49-8180-2)   (id) 
07:50:52,500 INFO [stdout] (http--10.36.1.49-8180-2)  values 
07:50:52,501 INFO [stdout] (http--10.36.1.49-8180-2)   (?) 
07:50:52,519 WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http--10.36.1.49-8180-2) SQL Error: 0, SQLState: 23505 
07:50:52,521 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http--10.36.1.49-8180-2) ERROR: duplicate key value violates unique constraint "tb_pessoa_pkey" 
    Detalhe: Key (id)=(438) already exists. 
+0

Есть ли конкретная причина, по которой вы не использовали 'serial', и сообщить Hibernate, что идентификатор автогенерации? –

+0

Какова ваша последовательность, пока она не сохранилась? Он может не начинаться с 500. Если вы проверите его из базы данных? – bhdrkn

+0

Добавьте журнал спящего режима ... tks. – Mamga

ответ

-1

Если вы сохраняющиеся новую сущность, что о попытке установить ID в null.

PessoaFisica pessoaFisica = new PessoaFisica(); 
pessoaFisica.setID(null); 
pessoaFisica.setEmail("[email protected]"); 

... 

em.persist(pessoa); 

Это гарантирует, что объект является новым, когда спящий режим пытается его сохранить.

+0

Его уже новый. Его не удалось. Какова цель установки нулевого идентификатора? – bhdrkn

+1

Если для нулевого значения «null» или «0» установлено значение ID, то hibernate принимает его как новый объект. – pmverma

+0

Я уже знаю это. Начиная с его нового объекта ('new PeassoaFisica();') по умолчанию его 'null'. Ничего не изменится, если вы снова и снова назначаете «null» на «ID». – bhdrkn

Смежные вопросы