【问题标题】:How should I store an Java Enum in JavaDB?我应该如何在 JavaDB 中存储 Java 枚举?
【发布时间】:2010-05-10 10:39:29
【问题描述】:

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

【问题讨论】:

    标签: java database orm enums javadb


    【解决方案1】:

    在 JPA 中,您有两种选择:

    1. 按名称;

    2. 按序数(整数)。

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

    【讨论】:

    • 谢谢,这是一个不错的解决方案。我现在在想,也许我将来想在 SQL 计算中使用这些值,所以也许我应该将这些值存储在他们自己的 db-table 中。
    【解决方案2】:

    我的偏好如下:

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

    优势

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-27
      • 2015-06-15
      • 1970-01-01
      • 2010-09-20
      相关资源
      最近更新 更多