持久化适合枚举的数据

2022-09-02 01:49:05

大多数项目都有某种数据,这些数据在发布之间基本上是静态的,非常适合用作枚举,如状态,事务类型,错误代码等。例如,我将只使用一个通用状态枚举:

public enum Status {
    ACTIVE(10, "Active");
    EXPIRED(11, "Expired");
    /* other statuses... */

    /* constructors, getters, etc. */
}

我想知道其他人在持久性方面对这样的数据做了什么。我看到一些选项,每个选项都有一些明显的优点和缺点:

  • 将可能的状态保留在状态表中,并保留所有可能的状态域对象的缓存,以便在整个应用程序中使用
  • 仅使用枚举,不要保留可用状态列表,从而在我和我的 DBA 之间造成数据一致性圣战
  • 在代码中保留状态并维护枚举,但不要将它们绑定在一起,从而创建重复的数据

我的偏好是第二种选择,尽管我的DBA声称我们的最终用户可能希望访问原始数据以生成报告,并且不保留状态会导致不完整的数据模型(反驳论点:这可以通过文档来解决)。

有没有大多数人在这里使用的约定?人们对每个人有什么经验,还有其他选择吗?

编辑:

在考虑了一段时间之后,我真正的持久性斗争是处理与数据库中的状态相关的id值。安装应用程序时,这些值将作为默认数据插入。此时,它们将具有可在其他表中用作外键的 ID。我觉得我的代码需要知道这些id,以便我可以轻松地检索状态对象并将其分配给其他对象。我该怎么办?我可以添加另一个字段,如“代码”,以查找内容,或者只是按名称查找状态,这很恶心。


答案 1

我们使用数据库中的一些显式字符串或字符值来存储枚举值。然后,为了从数据库值回到枚举,我们在枚举类上编写一个静态方法来迭代并找到正确的方法。

如果期望有大量的枚举值,则可以创建静态映射以快速转换。HashMap<String,MyEnum>

不要存储实际的枚举名称(即示例中的“ACTIVE”),因为开发人员很容易重构。


答案 2

我正在使用您记录的三种方法的混合...

使用数据库作为枚举值的权威源。将值存储在某种类型的“代码”表中。每次生成时,请为要包含在项目中的枚举生成一个类文件。

这样,如果枚举更改了数据库中的值,则代码将正确失效,并且您将从持续集成服务器收到相应的编译错误。您具有与数据库中枚举值的强类型绑定,并且不必担心在代码和数据之间手动同步值。