如何在JavaDB中存储Java Enum?
我应该尝试将枚举映射到SMALLINT
并仅将值保留在源代码中吗?嵌入式数据库仅由单个应用程序使用。或者我应该将值存储为DECIMAL
?这些解决方案对我来说都不是很好/健壮。还有更好的选择吗?
这是我的枚举:
import java.math.BigDecimal;
public enum Vat {
NORMAL(new BigDecimal("0.25")),
FOOD(new BigDecimal("0.12")),
BOOKS(new BigDecimal("0.06")),
NONE(new BigDecimal("0.00"));
private final BigDecimal value;
Vat(BigDecimal val) {
value = val;
}
public BigDecimal getValue() {
return value;
}
}
我已经阅读了有关此主题的其他类似问题,但问题或解决方案与我的问题不符。 Enum storage in Database field,Best method to store Enum in Database,Best way to store enum values in database - String or Int
答案 0 :(得分:9)
在JPA中,您有两种选择:
按名称;
按顺序(整数)。
我不喜欢(2)。如果你改变枚举的顺序就会中断。因此,使用(1)(根据我的经验)更为常见。
我会在JavaDB中做同样的事情。只需将枚举名称存储为文本即可。它的优点是你可以查看一行并知道它意味着什么,而不是试图找出status_id列中“3”的含义。
如果您担心空间(99%的时间我不会),请使用整数或使用代码。例如:
public enum Vat {
NORMAL(new BigDecimal("0.25")),
FOOD(new BigDecimal("0.12")),
BOOKS(new BigDecimal("0.06")),
NONE(new BigDecimal("0.00"));
private static final Map<String, Vat> LOOKUP = new HashMap<String, Vat>();
static {
Vat[] values = values();
for (Vat vat : values) {
LOOKUP.put(vat.code, vat);
}
}
private final String code;
private final String value;
private Vat(String code, BigDecimal value) {
this.code = code;
this.value = value;
}
public String getCode() { return code; }
public String getValue() { return value; }
public Vat fromCode(String code) {
return LOOKUP.get(code);
}
}
答案 1 :(得分:4)
我的偏好是做如下:
<强>优点强>
YourEnum
表的内容。这与cletus的解决方案类似,只是枚举编码显式存储在数据库中,而不是定义为枚举定义的一部分。