代码之家  ›  专栏  ›  技术社区  ›  Jonas

我应该如何在JavaDB中存储Java枚举?

  •  6
  • Jonas  · 技术社区  · 15 年前

    我应该如何在JavaDB中存储Java枚举?

    我应该尝试将枚举映射到 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

    2 回复  |  直到 15 年前
        1
  •  3
  •   Adamski    15 年前

    我的选择如下:

    • 使用以下列在数据库中创建专用枚举表:yourenumid smallint、yourenumname varchar(32)。
    • 在业务对象表中,向枚举表添加外键引用。
    • 实现Java DAO将枚举值映射到 特定于数据库 保存数据时的smallint值,或者实现接受枚举名(即varchar)并在写入数据时将其转换为smallint的存储过程。

    优势

    • 与在数据库表中显式存储字符串值相比,增加了正常化(因此降低了存储开销)。
    • 你的数据库数据 不会的 腐败的 如果你的Java枚举 定义更改(例如,如果 更改值的顺序)。
    • 你的道班可以 快速故障 在期间 通过检查 JavaEnUM定义匹配 的内容 YourEnum 表。
    • 您可以提供返回字符串枚举值的数据库视图(例如,如果您或用户希望直接查询表)。

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

        2
  •  8
  •   cletus    15 年前

    在JPA中,您有两个选择:

    1. 姓名;

    2. 按序数(整数)。

    我不喜欢(2)。如果更改枚举的顺序,它将中断。因此,使用(1)(以我的经验)更为常见。

    我也会在javadb中这样做。只需将枚举名存储为文本。它的优点是,您可以查看一行并知道它的含义,而不是试图找出“3”在status\u id列中的含义。

    如果你关心的是空间(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);
      }
    }