带有数据库的Java枚举支持最佳实践

时间:2012-11-13 13:24:32

标签: java mysql hibernate jpa enums

我已经四处寻找答案,但他们并不满足我。我希望这不会重复。

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

当我想比较这些常数时,我的问题出现了。比较使用它的ID对我来说似乎很难看,所以我虽然使用枚举来比较它们。但这看起来很尴尬,因为我会在一个用作“类型”的类中使用ENUM。所以我也在考虑JPA的@enumerated注释......但老实说,我没有看到最好的方法。我敢肯定的是,我绝对想要 - 这些 - 这些常量数据存储在数据库中。

3 个答案:

答案 0 :(得分:2)

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

  1. 创建enum并将其名称映射到DB。这种方法很简单,也可以使用。它的缺点是DB中的字符串太多。因此,如果要更改枚举元素名称,则必须修复数据库。琴弦占据空间。如果要将其用于查询条件,则此类字段需要建立索引。
  2. 创建enum并将其序号映射到DB。这也很简单,但DB需要维护甚至一个枚举元素的顺序也会改变。并且DB数据的可读性较差。
  3. #1和#2都有共同的缺点:实际上数据存储了两次:一次硬编码为枚举。 DB两次。如果您必须修改数据,则必须在2个位置执行此操作。必须在开发期间完成修改,因为必须重新编译enum

    然而,还有其他solution提供了所谓的“动态枚举”。看一看。这个解决方案可能对您有所帮助。

答案 1 :(得分:0)

以后可以修改的数据不再是常数而是变量......; - )

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

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

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

答案 2 :(得分:0)

另一种选择是使用String字段将枚举存储到数据库表中,然后将它们包装回去以供其他对象使用。

如下列之一:

Convert a String to an Enum?

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