Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java枚举与数据库支持最佳实践_Java_Mysql_Hibernate_Jpa_Enums - Fatal编程技术网

Java枚举与数据库支持最佳实践

Java枚举与数据库支持最佳实践,java,mysql,hibernate,jpa,enums,Java,Mysql,Hibernate,Jpa,Enums,我已经四处寻找了一些答案,但它们还不够让我满意。我希望这不是重复的 我有一个数据应该是常量的应用程序。这些数据可以在以后修改,所以我当前的方法是使用一个单独的表,其中包含这些常量,这些常量是从其他表引用的。例如,此表具有列ID和列值。这个表由一个具有ID和Value的Java对象表示 当我想比较这些常数时,我的问题就来了。比较使用它的ID对我来说似乎很难看,所以我想使用枚举来比较它们。但这看起来很尴尬,因为我将在用作“类型”的类中使用枚举。因此,我也在JPA的@enumerated注释中思考……

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

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


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

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

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


    然而,还有其他的方法提供所谓的“动态枚举”。看一看。也许这个解决方案会对你有所帮助

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

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

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


    另一种选择是使用字符串字段将枚举存储到数据库表中,并在返回时将它们包装起来,以供其他对象使用

    例如以下情况之一: