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

时间:2010-05-10 10:39:30

标签: java database orm enums javadb

如何在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 fieldBest method to store Enum in DatabaseBest way to store enum values in database - String or Int

2 个答案:

答案 0 :(得分:9)

在JPA中,您有两种选择:

  1. 按名称;

  2. 按顺序(整数)。

  3. 我不喜欢(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)

我的偏好是做如下:

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

<强>优点

  • 与将字符串值explcitly存储在数据库表中相比,增加了规范化(从而降低了存储开销)。
  • 您的数据库数据不会 如果您的java枚举已损坏 定义更改(例如,如果您 改变值的排序。)。
  • 您的DAO课程可以快速失败 通过检查确定初始化 Java枚举定义匹配 YourEnum表的内容。
  • 您可以在数据库上提供返回String枚举值的视图(例如,如果您或用户希望直接查询表)。

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