我正在尝试将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")));
有人可以告诉我如何将从视图收到的数据映射到枚举字段吗?
答案 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]);
但如果inbStatus
为0
或1
,则仅 。您应始终验证用户输入是否为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的映射。但只是个人感觉。