【问题标题】:Java enumerations with database support best practices具有数据库支持最佳实践的 Java 枚举
【发布时间】:2012-11-01 22:14:03
【问题描述】:

我已经四处寻找一些答案,但它们还不够让我满意。我希望这不会重复。

我有一个应用程序,其中的数据应该是恒定的。以后可以修改此数据,因此我当前的方法是使用带有此常量的单独表,该表从其他表中引用。例如,此表具有列 ID 和列值。而这张表是由一个带有ID和Value的Java对象来表示的。

当我想比较这个常量时,我​​的问题就来了。比较使用它的 ID 对我来说似乎很难看,所以我想使用枚举来比较它们。但这似乎很尴尬,因为我将在用作“类型”的类中使用 ENUM。所以我也在考虑 JPA 的 @enumerated 注释......但老实说,我没有看到最好的方法。我可以肯定的是,我绝对希望 - 不知何故 - 将这些常量数据存储在数据库中。

【问题讨论】:

    标签: java mysql hibernate jpa enums


    【解决方案1】:

    在我的脑海中,我可以考虑以下方法。

    1. 创建enum 并将其名称映射到DB。这种方法很简单并且会奏效。它的缺点是数据库中的字符串太多。因此,如果枚举元素名称正在更改,您必须修复数据库。字符串占用空间。如果您想将此类字段用于查询条件,则需要对此类字段进行索引。
    2. 创建enum 并将其序数映射到DB。这也很简单,但是即使更改了枚举元素的一个顺序,数据库也需要维护。而且数据库数据的可读性较差。

    #1 和#2 都有共同的缺点:实际上数据存储了两次:一次硬编码为枚举。在数据库中两次。如果您必须修改数据,则必须在 2 个地方执行此操作。必须在开发期间进行修改,因为必须重新编译 enum

    但是,还有其他 solution 提供所谓的“动态枚举”。看一看。可能此解决方案会对您有所帮助。

    【讨论】:

      【解决方案2】:

      以后可以修改的数据,不再是恒定的,而是可变的... ;-)

      无论如何:如果可能的值列表可以随时间变化,我认为使用 Enums 和 @enumerated JPA 注释没有问题。

      如果值本身可以更改,您将需要某种名称/值映射,以避免使用 ID 进行比较。您还可以将“属性”添加到枚举中,您可以将其用于数据的可变部分。这样,只有枚举的名称将作为常量字符串存储在数据库中(作为标识符),并且“值”可以在您的代码中更改。

      http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

      【讨论】:

        【解决方案3】:

        另一种选择是使用字符串字段将您的枚举存储到数据库表中,然后将它们包装起来以供其他对象使用。

        如以下之一:

        Convert a String to an Enum?

        http://www.vineetmanohar.com/2010/01/3-ways-to-serialize-java-enums/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-16
          • 2010-10-19
          • 1970-01-01
          • 2013-11-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多