休眠异常:枚举类的名称值未知

2022-09-02 13:10:09

我在尝试从 DB 检索记录时收到枚举类的未知名称值。使用 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: 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) 根本原因

javax.ejb.EJBTransactionRolledbackException: 未知名称值 enum class br.com.aaa.xxx.entidade.TipoPessoa: F .... ......


答案 1

休眠不知道也不关心你的枚举中的id字段。它所知道的只是序数值(0和1)和名称(FISICA和JURIDICA)。如果要持久保存 F 和 J,则必须将两个枚举常量重命名为 F 和 J,并按如下方式注释实体中的字段:

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

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


答案 2