2010-05-10 63 views
6

我应该如何在JavaDB中存储Java Enum?我应该如何将Java Enum存储在JavaDB中?

我应该尝试将枚举映射到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 fieldBest method to store Enum in DatabaseBest way to store enum values in database - String or Int

回答

3

我的选择是做如下:

  • 在数据库中的列创建一个专用的枚举表:YourEnumId SMALLINT,YourEnumName VARCHAR(32)。
  • 在您的业务对象表中添加对枚举表的外键引用。
  • 实现您的Java DAO将枚举值映射到数据库特定的 smallint值当持久化数据或实现接受枚举名的存储过程(即varchar)并在写入数据时将其转换为smallint。

优点

  • 增加正常化(和因此较低的存储开销)与数据库中的表存储explcitly字符串值进行比较。
  • 你的数据库中的数据不会 损坏如果您的Java枚举 定义的变化(例如,如果你 改变值的排序)。通过检查 的Java枚举定义YourEnum表的 内容匹配
  • 你的DAO类可以快速失败的期间 初始化。
  • 您可以在返回字符串枚举值的数据库上提供视图(例如,如果您或用户希望直接查询表)。

这与cletus的解决方案类似,不同之处在于枚举编码显式存储在数据库中,而不是定义为枚举定义的一部分。

8

在JPA中,你有两个选择:

  1. 按名称;

  2. By ordinal(integer)。

我不喜欢(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); 
    } 
} 
+0

谢谢,这是一个不错的解决方案。我现在在想,也许我想在将来使用SQL计算中的值,所以也许我应该将值存储在它们自己的db-table中。 – Jonas 2010-05-10 10:57:32

相关问题