2013-07-05 12 views
12

Uzyskiwanie nieznanej wartości nazwy dla klasy wyliczeniowej przy próbie pobrania rekordów z bazy danych. Używanie jsf 2.0, jpa.Wyjątek hibernacji: nieznana wartość nazwy dla klasy wyliczeniowej

Możliwe wartości w moim DB są 'F' lub '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; 
    } 
} 

podmiot:

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

public TipoPessoa getTipoPessoa() { 
    return tipoPessoa; 
} 

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

Kiedy próbuję czytać rekordy od DB Mam błąd

Czy możesz mi pomóc w tej sprawie? Dzięki

Ślad stosu:

javax.servlet.ServletException: Nieznany wartość nazwa klasy enum br.com.aaa.xxx.entidade.TipoPessoa: F javax.faces.webapp.FacesServlet.service (FacesServlet.java:606) br.com.aaa.filtro.FiltroEncode.doFilter (FiltroEncode.java:26) przyczyna

javax.ejb.EJBTransactionRolledbackException: Nieznany wartość nazwa klasy enum br.com.aaa. xxx.entidade.TipoPessoa: F .... ......

+0

pokaż stos stosu – surfealokesea

+0

Wykonujesz nieprawidłowe odwzorowanie. W jaki sposób Hibernate powinien wiedzieć, jak zamapować typ wyliczeniowy? Zobacz np. [to pytanie SO] (http://stackoverflow.com/questions/417062/enumerations-in-hibernate). –

+0

Stacktrace @ surfealokesea zaktualizowano w pytaniu. – Al2x

Odpowiedz

17

Hibernate nie zna i nie dba o pole identyfikacyjne wewnątrz wyliczenia. Wszystko, o czym wie, to wartość porządkowa (0 i 1) oraz nazwa (FISICA i JURIDICA). Jeśli chcesz utrzymywać F i J, będziesz musiał zmienić nazwę dwie stałe enum do F i J, i opisywanie pola w jednostce jak ten:

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

lub użyć niestandardowego typu użytkownika do przekształcenia F do FISICA lub odwrotnie.

+1

Czy zmieniłeś nazwę FISICA na F i JURIDICA na J? Pokaż nam swój zaktualizowany kod. –

+0

To świetnie. Pracował zgodnie z oczekiwaniami. Ale jak mogę zrobić, aby pełne nazwy zamiast F lub J? – Al2x

+1

Użyj niestandardowego typu użytkownika: http://docs.jboss.org/hibernate/orm/4.2/manual/en-US/html_single/#types-custom –

Powiązane problemy