1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

JPA Hibernate - Duplicate entry '1' for key 'UK_xxxx'

Estou tendo problemas ao persistir dados em uma entidade com relacionamento. Tenho a classe Produto, que representa o produto. Um produto ele pode ter um ou mais tipos de preço (Representante, Atacado, Varejo). Então defini uma classe para o cadastro deste tipos (TipoVenda.class) e uma classe para o relacionamento entre o Produto e o tipo de Venda (TipoVendaProdutoDetalhes.class). Conforme código abaixo, defini em Produto -> @OneToMany e TipoVendaProdutoDetalhes -> @ManyToOne Fazendo uso de classe para teste, eu consigo persistir o primeiro produto, porém ao tentar inserir novo produto apresenta o erro: "Duplicate entry '1' for key 'UK_xxxx'"

Já coloquei strategy = IDENTITY, como dito em alguns forums e não deu certo.

@Entity
@Table(name = "tab_produtos")
public class Produto implements Serializable {

@Id
@GeneratedValue
private Long id;
....
@OneToMany(mappedBy = "produto", targetEntity = TipoVendaProdutoDetalhes.class, 
    cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<TipoVendaProdutoDetalhes> tipoVendaDetalhes = new ArrayList<>();
@Entity
@Table(name = "tab_tipo_venda_prod_detalhes")
public class TipoVendaProdutoDetalhes implements Serializable {

@Id
@GeneratedValue
private Long id;
....

@OneToOne(optional = false, fetch = FetchType.LAZY)
@JoinColumn(name = "id_tipoVendaTipo")
private  TipoVenda tipoVenda;

@ManyToOne
@JoinColumn(name = "id_produto")
private Produto produto;
@Entity
@Table(name = "tab_tipo_venda_tipos")
public class TipoVenda implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
public static void insereProdutosComTipoVendaDetalhes() {

        EntityManager manager = JpaUtil.getEntityManager();

        TipoVenda tvRevenda = manager.find(TipoVenda.class, 1L);
        TipoVenda tvUnitario = manager.find(TipoVenda.class, 2L);
        TipoVendaProdutoDetalhes tvDetalheRevenda = new TipoVendaProdutoDetalhes();
        TipoVendaProdutoDetalhes tvDetalheUnitario = new TipoVendaProdutoDetalhes();

        EntityTransaction trx = manager.getTransaction();
        trx.begin();

        Produto p1 = new Produto();

        p1.setCodigoProduto("78912345678");

        tvDetalheRevenda.setTipoVenda(tvRevenda);
        tvDetalheRevenda.setProduto(p1);

        p1.getTipoVendaDetalhes().add(tvDetalheRevenda);
        tvDetalheRevenda.setProduto(p1);
        manager.persist(p1);
        manager.persist(tvDetalheRevenda);

        tvDetalheUnitario.setTipoVenda(tvUnitario);
        tvDetalheUnitario.setProduto(p1);


        p1.getTipoVendaDetalhes().add(tvDetalheUnitario);
        tvDetalheUnitario.setProduto(p1);
        manager.persist(tvDetalheUnitario);

        trx.commit();

        manager.close();
    }

Trace:


2017-10-31 16:18:00,579 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] SQL Error: 1062, SQLState: 23000
2017-10-31 16:18:00,580 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] Duplicate entry '1' for key 'UK_9i048awfw6ikkkkkrj9e84icv'
2017-10-31 16:18:00,583 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] SQL Warning Code: 1062, SQLState: 23000
2017-10-31 16:18:00,583 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] Duplicate entry '1' for key 'UK_9i048awfw6ikkkkkrj9e84icv'
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1763)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1683)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1187)
    at br.com.orei.testes.CriaBaseDados.insereProdutosComTipoVendaDetalhes(CriaBaseDados.java:188)
    at br.com.orei.testes.CriaBaseDados.main(CriaBaseDados.java:31)
Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:72)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:211)
    at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:96)
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:58)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3032)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3558)
    at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:98)
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:492)
    at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:197)
    at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:181)
    at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:216)
    at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:324)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:288)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:194)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125)
    at org.hibernate.jpa.event.internal.core.JpaPersistEventListener.saveWithGeneratedId(JpaPersistEventListener.java:84)
    at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:206)
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:149)
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:801)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:794)
    at org.hibernate.jpa.event.internal.core.JpaPersistEventListener$1.cascade(JpaPersistEventListener.java:97)
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:350)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:293)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:161)
    at org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:379)
    at org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:319)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:296)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:161)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:118)
    at org.hibernate.event.internal.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:460)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:294)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:194)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125)
    at org.hibernate.jpa.event.internal.core.JpaPersistEventListener.saveWithGeneratedId(JpaPersistEventListener.java:84)
    at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:206)
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:149)
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:75)
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:811)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:784)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:789)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1181)
    ... 2 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'UK_9i048awfw6ikkkkkrj9e84icv'
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:377)
    at com.mysql.jdbc.Util.getInstance(Util.java:360)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:971)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3887)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3823)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2530)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1907)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2141)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2077)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2062)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208)
    ... 41 more

Como posso resovler este erro?

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags jpa hibernate ou faça a sua própria pergunta.