前言
我们知道对于枚举既可以存储字符串也可以存储数字,那我们看看在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。好了,本节我们到此结束,下一节我们开始进入到关系映射讲解。