前言
我們知道對於枚舉既可以存儲字符串也可以存儲數字,那我們看看在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。好了,本節我們到此結束,下一節我們開始進入到關系映射講解。