如何在数据库中建模(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? 谢谢 !!
我通常采用以下解决方案,它提供了完全规范化的数据库模式。
- 创建一个专用表来表示您的枚举; 例如
Colour
。 该表将有两列:- ID列(主键)。 通常是自动递增
int
,smallint或tinyint
。 - 名称列(候选键)。 这将是一个
varchar
其值应与Java枚举相同。
- ID列(主键)。 通常是自动递增
- 创建Java枚举:与数据库中的
Colour
表具有相同值的Colour
。 -
假设您现在有一个包含引用
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属性,就可以自由重新排序和重命名枚举值。