【问题标题】:Hibernate Exception: Unknown name value for enum class休眠异常:枚举类的未知名称值
【发布时间】:2013-07-03 20:01:57
【问题描述】:

尝试从数据库中检索记录时,我得到了枚举类的未知名称值。使用 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 .... ......

【问题讨论】:

  • 你做错了映射。 Hibernate 应该如何知道如何映射枚举类型?参见例如this SO question.
  • @surfealokesea 堆栈跟踪已在问题中更新。

标签: java hibernate jpa enums


【解决方案1】:

Hibernate 不知道也不关心枚举中的 id 字段。它所知道的只是序数值(0 和 1)和名称(FISICA 和 JURIDICA)。如果要保留 F 和 J,则必须将两个枚举常量重命名为 F 和 J,并像这样注释实体中的字段:

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

或使用自定义用户类型将 F 转换为 FISICA,反之亦然。

【讨论】:

  • 太好了。按预期工作。但是我该怎么做才能让全名代替 F 或 J ?
  • 已解决* @JB Nizet 非常感谢您的帮助。我刚接触 Java,花了几个小时试图解决这个问题。现在它由你修复:)
  • @JB Nizet 当我在 java 中删除枚举字符串时。但它在数据库中。当我从数据库中检索记录时。它给出了一个空指针异常。如何克服这个问题?
  • @KumaresanPerumal 所以你在数据库中有一个值应该映射到一个枚举,但没有任何有效的枚举值?不要那样做。将数据库中的值更改为有效的枚举值,或保持枚举不变。
猜你喜欢
  • 2013-10-27
  • 2015-07-28
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多