有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

Hi-am使用名为“性别”的列为实体建模。在应用程序代码中,性别应该是(Java)枚举类型,有2个值(男性和女性)。。知道作为数据类型的枚举不是通用SQL(语言)92的一部分,您将如何对其建模

数据模型必须是可移植的,才能被几个DBMS(Mysql、Oracle、Derby)和几个持久性提供者(JPA、Hibernate、JDBC)使用。 我觉得它有两个层次: -首先是模式和实体的级别(将枚举存储为-VAR-CHAR或INT) -其次是应用程序代码的级别(JDBC不支持枚举,JPA支持,但这取决于实现)

是否有一个通用的解决方案,例如适用于Mysql DBMS? 谢谢


共 (2) 个答案

  1. # 1 楼答案

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

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

      创建过程dbo。插入记录 @颜色varchar(32) 像 ...

    存储过程将执行必要的字符串到int的转换,使数据表能够通过int外键引用颜色表

    同样,您可以在数据表上创建一个视图,该视图将在后台连接到颜色表,以向应用程序或最终用户显示数据的非规范化过孔

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

  2. # 2 楼答案

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

    如果您使用的是像Hibernate这样的或映射程序,它会为您这样做,否则您需要手动将枚举转换为整数/长或字符串,反之亦然

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