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

posted @ 2020-03-07 14:34  Jeffcky  阅读(2880)  评论(0编辑  收藏  举报