Hibernate入门之注解@Enumerated详解

前言

我们知道对于枚举既可以存储字符串也可以存储数字,那我们看看在JPA中到底应该如何正确的配置呢,文中若有错误之处,还望指正。

@Enumerated注解

在JPA中,必须用@Enumerated注解标记Enum类型,配置枚举类型有ORDINAL和STRING两种。接下来我们定义一个Order对象,如下:

复制代码
@Entity
@Table(name = "orders")
public class Order {

    @Id
    @GeneratedValue
    public long id;

    @Enumerated
    private Status status;
}
复制代码

此时将映射为int类型,这也是默认映射的类型即ORDINAL,将枚举映射到表中的列类型为tinyint、enum应该是我们常见的方案,接下来我们来看看映射为varchar,如下:

复制代码
@Entity
@Table(name = "orders")
public class Order {

    @Id
    @GeneratedValue
    public long id;

    @Enumerated(EnumType.STRING)
    @Column(length = 8)
    private Status status;
}
复制代码

如我们预期的结果,枚举类型为String表示来填充关联的数据库列值,对于我们开发人员而言,此列虽可读性强,但是明显将占用大量的空间,在这种情况下,状态列占用8个字节,如果我们要存储1亿条记录,仅status列将占用800 MB,所以我们都不会将枚举类型映射为varchar。我们可以将java中的枚举类型映射为数据库表中的列映射为enum,进行如下配置:

@Enumerated(EnumType.STRING)
@Column(columnDefinition = "enum('PENDING','SUCCESS', 'FAILED', 'CANCEL', 'CLOSED')")
private Status status;

将枚举类型映射为enum在网上存在较大的争议,这不是我们关注的点,其实我们也可以映射为tinyint、smallint类型,不过对于枚举类型利用tinyint已足够,我们进行如下配置:

@Enumerated
@Column(columnDefinition = "tinyint")
private Status status;

我个人认为将枚举映射为tinyint是最合适的,因为它效率更高,但可读性却不强,我们并不知道具体数字代表什么含义,对开发人员并不友好,其实在这种情况下,我们完全可以再创建一个表对状态的描述。

总结 

本节我们详细讲解了枚举注解,枚举注解类型有有两种ORDINAL和STRING两种,默认的ORDINAL映射为int,我们也可以通过columnDefinition映射为smallint、tinyint,而对于STRING我们可以映射为varchar、enum,在实际开发中,大部分情况应该都是将枚举映射为enum或者tinyint。好了,本节我们到此结束,下一节我们开始进入到关系映射讲解。


为了方便大家在移动端也能看到我分享的博文,现已注册个人公众号,扫描上方左边二维码即可,欢迎大家关注,有时间会及时分享相关技术博文。

感谢花时间阅读此篇文章,如果您觉得这篇文章你学到了东西也是为了犒劳下博主的码字不易不妨打赏一下吧,让楼主能喝上一杯咖啡,在此谢过了!
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!
本文版权归作者和博客园共有,来源网址:http://www.cnblogs.com/CreateMyself)/欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
posted @   Jeffcky  阅读(2955)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示