Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hibernate Exception: Unknown name value for enum class

I'm getting Unknown name value for enum class when trying to retrieve records from DB. Using JSF 2.0, JPA.

The possible values in my DB are 'F' or 'J'

Enum:

public enum TipoPessoa {

    FISICA ("F", "Física"),
    JURIDICA ("J", "Jurídica");

    private final String id;
    private final String descricao;

    private TipoPessoa(String id, String descricao){
        this.id = id;
        this.descricao = descricao;
    }

    public String getId() {
        return id;
    }

    public String getDescricao(){
        return descricao;
    }
}

Entity:

@Column(nullable=false, length=1)
private TipoPessoa tipoPessoa;

public TipoPessoa getTipoPessoa() {
    return tipoPessoa;
}

public void setTipoPessoa(TipoPessoa tipoPessoa) {
    this.tipoPessoa = tipoPessoa;
}

When I try to read the records from DB I got the error

Would you please help me on this issue? thanks

Stack trace:

javax.servlet.ServletException: Unknown name value for enum class br.com.aaa.xxx.entidade.TipoPessoa: F javax.faces.webapp.FacesServlet.service(FacesServlet.java:606) br.com.aaa.filtro.FiltroEncode.doFilter(FiltroEncode.java:26) root cause

javax.ejb.EJBTransactionRolledbackException: Unknown name value for enum class br.com.aaa.xxx.entidade.TipoPessoa: F .... ......

like image 964
Al2x Avatar asked Jul 05 '13 16:07

Al2x


1 Answers

Hibernate doesn't know and care about the id field inside your enum. All it knows about is the ordinal value (0 and 1) and the name (FISICA and JURIDICA). If you want to persist F and J, you'll have to rename your two enum constants to F and J, and annotate the field in the entity like this:

@Column(nullable=false, length=1)
@Enumerated(EnumType.STRING)
private TipoPessoa tipoPessoa;

or use a custom user type to transform F to FISICA or vice-versa.

like image 111
JB Nizet Avatar answered Nov 07 '22 19:11

JB Nizet