2
respostas

Olá, professor, gostaria de saber o motivo desse erro e sua solução...

Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.HibernateException: More than one row with the given identifier was found: br.com.mycompany.loja.modelo.CategoriaId@f0a66bd, for class: br.com.mycompany.loja.modelo.Categoria
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)
    at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:804)
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:780)
    at br.com.mycompany.loja.main.Debug.cad_Produto(Debug.java:95)
    at br.com.mycompany.loja.main.Debug.main(Debug.java:23)
Caused by: org.hibernate.HibernateException: More than one row with the given identifier was found: br.com.mycompany.loja.modelo.CategoriaId@f0a66bd, for class: br.com.mycompany.loja.modelo.Categoria
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:99)
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:61)
    at org.hibernate.persister.entity.AbstractEntityPersister.doLoad(AbstractEntityPersister.java:4442)
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4432)
    at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:569)
    at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:537)
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:208)
    at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:332)
    at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:108)
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:74)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:113)
    at org.hibernate.internal.SessionImpl.fireLoadNoChecks(SessionImpl.java:1186)
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1175)
    at org.hibernate.internal.SessionImpl.access$2100(SessionImpl.java:193)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.doLoad(SessionImpl.java:2786)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.lambda$load$1(SessionImpl.java:2767)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.perform(SessionImpl.java:2723)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2767)
    at org.hibernate.internal.SessionImpl.get(SessionImpl.java:988)
    at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:306)
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:172)
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:70)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:102)
    at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:793)
    ... 3 more
2 respostas

Olá Erik!

Pelo erro que você está enfrentando, parece que o problema está relacionado a uma chave composta em sua entidade Categoria. O erro "More than one row with the given identifier was found" indica que o Hibernate encontrou mais de uma linha no banco de dados com o mesmo identificador, o que não deveria acontecer, especialmente se você estiver usando uma chave composta.

Aqui estão algumas sugestões para resolver esse problema:

  1. Verifique a Chave Composta: Certifique-se de que a chave composta está corretamente mapeada na sua entidade Categoria. Você deve ter uma classe anotada com @Embeddable que representa a chave composta e, em sua entidade, usar @EmbeddedId para referenciar essa chave.

  2. Consistência dos Dados: Verifique se os dados no banco de dados são consistentes. É possível que existam registros duplicados para a chave composta, o que pode estar causando esse erro. Você pode executar uma consulta SQL diretamente no banco de dados para verificar se há duplicatas.

  3. Configuração do Hibernate: Verifique se a configuração do Hibernate está correta e se não há algo que possa estar interferindo na forma como as chaves compostas estão sendo gerenciadas.

  4. Revisão do Código: Revise o método cad_Produto na classe Debug para garantir que ele está manipulando corretamente as entidades e suas chaves compostas.

Como exemplo, se você tiver uma chave composta como CategoriaId, ela deve ser algo assim:

@Embeddable
public class CategoriaId implements Serializable {
    private Long idPart1;
    private Long idPart2;

    // getters, setters, hashCode, equals
}

E na sua entidade Categoria:

@Entity
public class Categoria {
    @EmbeddedId
    private CategoriaId id;

    // outros atributos e métodos
}

Espero ter ajudado e bons estudos!

Valeu professor, Rodrigo!