首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在数据库中对(Java)枚举建模(使用SQL92)

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

Stack Overflow用户
提问于 2012-04-02 22:14:55
回答 2查看 3K关注 0票数 2

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-02 22:22:51

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

  1. 创建一个专用表来表示您的枚举;例如Colour。该表有两列:
    • An ID列(主键)。通常是自动递增的int、smallint或tinyint.
    • A name列(候选键)。这将是一个其值应与Java enumeration.

相同的varchar

在database.

  • Assuming中使用与表相同的值创建一个Java enum:
  1. 现在有了一个包含引用Colour表的记录的"Data“表,实现一个用于插入记录的存储过程,该过程接受Colour字符串值(如您的Java enum所描述的);例如,创建一个Colour表。

将过程dbo.InsertRecord @colour (32)创建为...

存储过程将执行必要的字符串到int的转换,允许您的数据表通过int外键引用Colour表。

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

存储过程方法的替代方法是在启动时读取并缓存应用程序中的序号名称映射。这样做的好处是能够与数据库中Colour表的内容相比较来验证Java Colour枚举的完整性。

票数 2
EN

Stack Overflow用户

发布于 2012-04-02 22:22:12

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

如果你使用像Hibernate这样的or映射器,它会帮你做到这一点,否则你需要手动将枚举转换为整数/长整型或字符串,反之亦然。

为了更安全,您可以向枚举添加一个自定义属性,并为该属性提供一个getter和一个转换函数-> enum value。这样,只要不更改id属性,您就可以自由地对枚举值进行重新排序和重命名。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9978089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档