枚举在Hibernate中保存

时间:2014-01-16 17:11:18

标签: java hibernate enums

我正在尝试将Enum字段保存到数据库,但我在将字段映射到数据库时遇到问题。我的代码如下:

public enum InvoiceStatus {
PAID,
UNPAID;
}

我正在我的一个应用程序类中使用此枚举,如下所示:

public class Invoice {

Enumerated(EnumType.ORDINAL)
@Column(name="INVOICE_STATUS", nullable = false, unique=false)
private InvoiceStatus invoiceStatus;

}

最后,我让app用户使用下拉菜单从视图(JSP)中选择Invoice Status。

但我不知道如何将从下拉菜单选择中收到的值映射到发票状态字段

我尝试将收到的值映射为short,如下所示,但不会编译

invoice.setInvoiceStatus(Short.parseShort(request.getParameter("inbStatus")));

有人可以告诉我如何将从视图收到的数据映射到枚举字段吗?

2 个答案:

答案 0 :(得分:2)

枚举序数值是基于零的索引。在你的情况下:

PAID = 0
UNPAID = 1

以下代码将返回PAID

int invoiceStatus = 0;
invoice.setInvoiceStatus(InvoiceStatus.values()[invoiceStatus]);

以下代码将返回UNPAID

int invoiceStatus = 1;
invoice.setInvoiceStatus(InvoiceStatus.values()[invoiceStatus]);

这意味着你应该能够这样做:

short invoiceStatus = Short.parseShort(request.getParameter("inbStatus"));
invoice.setInvoiceStatus(InvoiceStatus.values()[invoiceStatus]);

但如果inbStatus01,则仅 。您应始终验证用户输入是否为null和无效值。

答案 1 :(得分:2)

我看到你正在使用

Enumerated(EnumType.ORDINAL)
然而,过了一段时间,如果你的枚举会增长,那么排除故障可能会非常困难。序数的另一个问题是您可以重构代码并更改枚举值的顺序,之后您可能遇到麻烦。主要是如果它是一个共享的代码库,有人只是决定清理代码并“将相关的枚举常量组合在一起”。如果您将使用:

Enumerated(EnumType.STRING)

直接将枚举“name”插入数据库中。 (因此你需要Varchar类型)。如果你想提供更多用户友好版本的枚举,你可能会:

public enum InvoiceStatus {
    PAID(0, "Paid"), UNPAID(1, "Unpaid"), FAILED(2, "Failed"), PENDING(3, "Pending");

    private int st;
    private in uiLabel;

    private InvoiceStatus(int st, String uiLabel){
        this.st = st;
        this.uiLabel = uiLabel;
    }

    private Map<String, InvoiceStatus> uiLabelMap = new HashMap<String, InvoiceStatus> ();

    static {
      for(InvoiceStatus status : values()) {
        uiLableMap.put(status.getUiLabel(), status);
      }
    }

    /** Returns the appropriate enum based on the String representation used in ui forms */
    public InvoiceStatus fromUiLabel(String uiLabel) {
      return uiLableMap.get(uiLabel); // plus some tweaks (null check or whatever)
    }

       //
       // Same logic for the ORDINAL if you are keen to use it
       //

}

可能这也可以解决您的问题,但我真的不会使用基于ORDINAL的映射。但只是个人感觉。