Construtor enum privado - org.hibernate.InstantiationException: No default constructor for entity

7 respostas
S

galera
tenho uma entity que é um enum. segue ela abaixo

@Entity
public enum SubLista implements Serializable {
    
	DISQUETE_CONSULTA("Disquete Consulta FCC"),
	LISTA_ALFA_COLEGIO("Lista alfa colégio"),
	LISTA_ALFA_POSTO("Lista alfa posto"),
	LISTA_CADASTRO("Lista de Cadastro (Alfa geral)"),
	LISTA_PRESENCA("Lista de presenca com espaço para assinatura"),
	LISTA_SALA_DUPLO_LINGUA("Lista de sala - fomato duplo (c/ mist. de língua)"),
	LISTA_SALA_DUPLO_HORARIO("Lista de sala - formato duplo (com horário)"),
	LISTA_SALA_SIMPLES("Lista de sala - formato simples"),
	RELATORIO_INSCRICAO("Relatório com nº de inscrição e tipo de prova"),
	RELATORIO_RESERVA_PROVAS("Relatório de reserva de provas");

	
	private String descricao;
	private String especificacao;
	@Id
	private String idSublista;
	
	SubLista(String descricao)	{
		this.descricao = descricao;
	}

o problema é que o hibernate da um erro quando eu tento carregar esta Entity do banco de dados
eu recebo o seguinte erro:

org.hibernate.InstantiationException: No default constructor for entity

tentei colocar um construtor público vazio, mas o enum só aceita construtores privados
como resolver isso?

7 Respostas

S

cara
eu omiti os get´s e set´s pra ficar + simples de ler
E esse meu enum tem variáveis de instância, por isso acredito que ele precisa ser um Entity
E mesmo que eu coloque o construtor vazio como private, continua dando o mesmo erro. Imagino que é porque o Hibernate não consegue acessar ele
to numa sinuca =[

segue a classe completa pra esclarecer mais

package beans.beansListas.model;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Transient;

import org.apache.commons.fileupload.FileItem;

@Entity
public enum SubLista implements Serializable {
    
	DISQUETE_CONSULTA("Disquete Consulta FCC"),
	LISTA_ALFA_COLEGIO("Lista alfa colégio"),
	LISTA_ALFA_POSTO("Lista alfa posto"),
	LISTA_CADASTRO("Lista de Cadastro (Alfa geral)"),
	LISTA_PRESENCA("Lista de presenca com espaço para assinatura"),
	LISTA_SALA_DUPLO_LINGUA("Lista de sala - fomato duplo (c/ mist. de língua)"),
	LISTA_SALA_DUPLO_HORARIO("Lista de sala - formato duplo (com horário)"),
	LISTA_SALA_SIMPLES("Lista de sala - formato simples"),
	RELATORIO_INSCRICAO("Relatório com nº de inscrição e tipo de prova"),
	RELATORIO_RESERVA_PROVAS("Relatório de reserva de provas");

	@Id
	private String idSublista;
	private String descricao;
	private String especificacao;
	@Transient
	private FileItem fileItem;
	
	
	SubLista(String descricao)	{
		this.descricao = descricao;
	}

	
	public String getEspecificacao() {
		return especificacao;
	}
	public void setEspecificacao(String especificacao) {
		this.especificacao = especificacao;
	}
	public void setIdSublista(String idSublista) {
		this.idSublista = idSublista;
	}
	public FileItem getFileItem() {
		return fileItem;
	}
	public void setFileItem(FileItem fileItem) {
		this.fileItem = fileItem;
	}


}
S

qual a solução então?
deixar de ser enum e transformar numa classe, mas com um atributo enum?

S

é
isso aí vai resolver
brigadão cara

R
//Remova o implements Serializable
//Remova o @Entity

 

//Remova @Id e seu atributo

  private SubLista(final String descricao)  {  
        this.descricao = descricao;  
     }

coloque o construtor como private!!!

Não entendi, pq vc tem dois atributo String sendo que vc só esta colocando só um no construtor e nas constantes?
Cade os get’s

R
public enum SubLista {

	DISQUETE_CONSULTA("Disquete Consulta FCC"),  
	LISTA_ALFA_COLEGIO("Lista alfa colégio"),  
	LISTA_ALFA_POSTO("Lista alfa posto"),  
	LISTA_CADASTRO("Lista de Cadastro (Alfa geral)"),  
	LISTA_PRESENCA("Lista de presenca com espaço para assinatura"),  
	LISTA_SALA_DUPLO_LINGUA("Lista de sala - fomato duplo (c/ mist. de língua)"),  
	LISTA_SALA_DUPLO_HORARIO("Lista de sala - formato duplo (com horário)"),  
	LISTA_SALA_SIMPLES("Lista de sala - formato simples"),  
	RELATORIO_INSCRICAO("Relatório com nº de inscrição e tipo de prova"),  
	RELATORIO_RESERVA_PROVAS("Relatório de reserva de provas");  


	private String descricao;  

	private SubLista(final String descricao)  {  
		this.descricao = descricao;  
	}

	public String getDescricao() {
		return descricao;
	}  
}
R

Enum não é persistida no banco por isso vc naum pode usar @Entity

vc tem 3 variaveis String mas na constante só esta uma

R

Faz Assim crie uma Enum

public enum SubListaEnum {


	DISQUETE_CONSULTA("Disquete Consulta FCC"),  
	LISTA_ALFA_COLEGIO("Lista alfa colégio"),  
	LISTA_ALFA_POSTO("Lista alfa posto"),  
	LISTA_CADASTRO("Lista de Cadastro (Alfa geral)"),  
	LISTA_PRESENCA("Lista de presenca com espaço para assinatura"),  
	LISTA_SALA_DUPLO_LINGUA("Lista de sala - fomato duplo (c/ mist. de língua)"),  
	LISTA_SALA_DUPLO_HORARIO("Lista de sala - formato duplo (com horário)"),  
	LISTA_SALA_SIMPLES("Lista de sala - formato simples"),  
	RELATORIO_INSCRICAO("Relatório com nº de inscrição e tipo de prova"),  
	RELATORIO_RESERVA_PROVAS("Relatório de reserva de provas");  



	private String descricao;  


	private SubListaEnum(final String descricao)  {  
		this.descricao = descricao;  
	}


	public String getDescricao() {
		return descricao;
	}  


}

depois crie uma classe bean

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Transient;

@Entity
public class SublistaBean implements Serializable {
	
	private static final long serialVersionUID = 1L;
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private long idSublista;  
	@Enumerated(EnumType.STRING)
	private SubListaEnum descricao;  
	private String especificacao;  
	@Transient  
	private FileItem fileItem;  


	public String getEspecificacao() {  
		return especificacao;  
	}  
	public void setEspecificacao(String especificacao) {  
		this.especificacao = especificacao;  
	}  
	public long getIdSublista() {
		return idSublista;
	}  
	public void setIdSublista(long idSublista) {  
		this.idSublista = idSublista;  
	}  
	public FileItem getFileItem() {  
		return fileItem;  
	}  
	public void setFileItem(FileItem fileItem) {  
		this.fileItem = fileItem;  
	}
	public SubListaEnum getDescricao() {
		return descricao;
	}
	public void setDescricao(SubListaEnum descricao) {
		this.descricao = descricao;
	}

}

pronto axo que isso q vc quer!!!

Criado 25 de outubro de 2007
Ultima resposta 25 de out. de 2007
Respostas 7
Participantes 2