Olá Pessoal, tudo bom?
Hoje iremos falar sobre um erro de Mapeamento de Entidades JPA, mais especificamente da exception org.hibernate.InstantiationException: No default constructor for entity
Descrição do Erro
Para que o JPA possa instânciar classes ao trazer informações do Banco de Dados ele utiliza-se do conceito de Reflection.
O javax.reflection é um pacote que faz parte da API do Java o qual permite criar chamadas em tempo de execução, sem precisar conhecer métodos das classes e objetos envolvidos quando escrevemos nosso código (tempo de compilação). Esse dinamismo é necessário para resolvermos determinadas tarefas que nosso programa só descobre serem necessárias ao receber dados, em tempo de execução.
Assim o JPA utiliza-se do construtor default de qualquer classe para realizar a instância dessas. Caso você não tenha criado um construtor default, mesmo que private, o JPA irá gerar um erro com uma stack trace muito parecida com a seguinte stack:
org.hibernate.InstantiationException: No default constructor for entity: br.pucpr.bsi.prog6.ticketsEventosBSI.model.Artista
at org.hibernate.cfg.InheritanceState.determineDefaultAccessType(InheritanceState.java:277)
at org.hibernate.cfg.InheritanceState.getElementsToProcess(InheritanceState.java:224)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:707)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3568)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3522)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1379)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1784)
at br.pucpr.bsi.prog6.ticketsEventosBSI.dao.util.HibernateUtil.getSessionFactory(HibernateUtil.java:23)
at br.pucpr.bsi.prog6.ticketsEventosBSI.dao.util.HibernateUtil.getSession(HibernateUtil.java:29)
at br.pucpr.bsi.prog6.ticketsEventosBSI.dao.PatternDAO.insert(PatternDAO.java:84)
at br.pucpr.bsi.prog6.ticketsEventosBSI.bc.ArtistaBC.insert(ArtistaBC.java:29)
… 35 more
Solução
A solução para este erro é criar um construtor default dentro da sua classe. Esse construtor pode ser public, protected, private. O ponto aqui é criar um construtor que não interfira com as regras negociais criadas a partir da análise do diagrama de classes da camada Model, para construtores obrigatórios (Duvidas? Dê uma olhada nesse link). Como mostra o código abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package br.com.mauda.example.model; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class Artista implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY) private Long id; private String nome; public Artista(){ } //outros atributos, métodos e construtores } |
finally{
Caso você achou mais alguma solução para essa exception, por favor deixe nos comentários abaixo!
Duvidas ou sugestões? Deixe seu feedback! Isso ajuda a saber a sua opinião sobre os artigos e melhorá-los para o futuro! Isso é muito importante!
Até um próximo post!
Vinicius says
Muito obrigado cara, muito obrigado mesmo, ja estava a uma hora aqui com a cabeça a ponto de estourar procurando uma solução, muito obrigado mesmo.
Mauda says
Olá Vinicius, tudo bom?
Obrigado pelo feedback!
Precisando estamos aqui!
Obrigado.
Ruan says
Me ajudou tbm, obrigado mauda!
Mauda says
Olá Ruan, tudo bom?
Obrigado pelo feedback!
Precisando estamos aqui!
Abraços!
Gabriel Soares Morare says
Me ajudou muito!! Muitissimo obrigado!
Mauda says
Olá Gabriel, tudo bom?
Que bom que o artigo foi útil!
Obrigado pelo feedback!
Precisando estamos aqui!
Bruno Soares says
Me ajudou tbm, obrigado mauda!
Mauda says
Olá Bruno, tudo bem?
Legal! Obrigado pelo feedback!
Precisando estamos aqui!
Obrigado