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。好了,本節我們到此結束,下一節我們開始進入到關系映射講解。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM