如何在数据库中建模(Java)枚举(使用SQL92)

您正在使用名为“Gender”的列为实体建模。 在应用程序代码中,性别应该是(Java)枚举类型,具有2个值(MALE和FEMALE)..如何将其建模,知道Enums as Datatype不是通用SQL(语言)的一部分92 。

数据模型必须是可移植的,以便被几个DBMS(Mysql,Oracle,Derby)和几个持久性提供程序(JPA,Hibernate,JDBC)使用。 我觉得,它达到了两个级别: – 首先是Schema和实体的级别(将枚举存储为-VAR-CHAR或INT) – 第二个应用程序代码的级别(JDBC不支持枚举,JPA但是这取决于实施)

是否存在通用解决方案,例如适用于Mysql DBMS? 谢谢 !!

我通常采用以下解决方案,它提供了完全规范化的数据库模式。

  1. 创建一个专用表来表示您的枚举; 例如Colour 。 该表将有两列:
    • ID列(主键)。 通常是自动递增int ,smallint或tinyint
    • 名称列(候选键)。 这将是一个varchar其值应与Java枚举相同。
  2. 创建Java枚举:与数据库中的Colour表具有相同值的Colour
  3. 假设您现在有一个包含引用Colour表的记录的“Data”表,请实现一个用于插入记录的存储过程,该记录采用Color String值(如Java枚举所述); 例如

    CREATE PROCEDURE dbo.InsertRecord @colour varchar(32)AS …

存储过程将执行必要的String-to-int转换,允许数据表通过int外键引用Color表。

类似地,您可以在数据表上创建一个视图,该视图将在后台连接到Color表,以将数据的非规范化过程呈现给应用程序或最终用户。

存储过程方法的替代方法是在启动时读取并缓存应用程序中的序号,名称映射。 与数据库中Color表的内容相比,这样做的优点是能够validationJava Color枚举的完整性。

枚举具有至少两个可以识别它们的属性:序数(枚举列表中实例的位置)和名称。 两者都可以存储在数据库中,并用于检索正确的枚举实例。

如果您正在使用像Hibernate这样的OR映射器,它会为您执行此操作,否则您需要手动将枚举转换为整数/长整数或字符串,反之亦然。

为了使其更安全,您可以为枚举添加自定义属性,并为属性提供getter,以及为property-> enum值提供aconversion函数。 这样,只要不更改id属性,就可以自由重新排序和重命名枚举值。