2013-07-05 64 views
12

当试图从数据库检索记录时,Im获取了枚举类的未知名称值。使用jsf 2.0,jpa。休眠异常:枚举类的未知名称值

在我的数据库可能的值是 'F' 或 'J'

枚举:

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; 
    } 
} 

实体:

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

public TipoPessoa getTipoPessoa() { 
    return tipoPessoa; 
} 

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

当我尝试阅读来自DB的记录我得到了错误

你能帮我解决这个问题吗?感谢

堆栈跟踪:

javax.servlet.ServletException:为枚举类br.com.aaa.xxx.entidade.TipoPessoa未知名值:F javax.faces.webapp.FacesServlet.service( FacesServlet.java:606) br.com.aaa.filtro.FiltroEncode.doFilter(FiltroEncode.java:26) 根源

javax.ejb.EJBTransactionRolledbackException:用于枚举类br.com.aaa未知的名称值。 xxx.entidade.TipoPessoa:F .... ......

+0

显示堆栈跟踪 – surfealokesea

+0

您正在执行映射错误。 Hibernate应该如何知道如何映射枚举类型?见例如[这个问题](http://stackoverflow.com/questions/417062/enumerations-in-hibernate)。 –

+0

@surfealokesea stacktrace在问题中更新。 – Al2x

回答

17

Hibernate不知道和关心枚举中的id字段。它所知道的只是序数值(0和1)和名称(FISICA和JURIDICA)。如果你想坚持˚F和J,你必须重命名你的两个枚举常量到F和J,而在这样的实体注释字段:

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

或使用自定义用户类型变换F到FISICA或反之亦然。

+1

您是否将FISICA重命名为F和JURIDICA?向我们显示您的更新代码。 –

+0

好极了。按预期工作。但我怎么能让全名改为F或J? – Al2x

+1

使用自定义用户类型:http://docs.jboss.org/hibernate/orm/4.2/manual/en-US/html_single/#types-custom –