繁体   English   中英

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

[英]Java enumerations with database support best practices

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

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

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

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

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

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

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

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

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

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

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

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

如下列之一:

将字符串转换为枚举?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM