zoukankan      html  css  js  c++  java
  • 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。好了,本节我们到此结束,下一节我们开始进入到关系映射讲解。

  • 相关阅读:
    attr全选第三次失效
    数据库拆分案例
    c#日期格式化
    MVC CheckBoxList的实现
    SQLSERVER如何使用递增排序的GUID做主键
    .net App_Browser文件夹的作用
    如何强制浏览器使用兼容模式
    MVC防止xss攻击 ——Html.AntiForgeryToken的AJAX提交
    数据库大数据量迁移的解决思路
    IIS同时实现网站部分使用https协议访问另一部分http访问
  • 原文地址:https://www.cnblogs.com/CreateMyself/p/12431515.html
Copyright © 2011-2022 走看看