實體Entity中通過@Enumerated標注枚舉類型,例如將CustomerEO實體中增加一個CustomerType類型的枚舉型屬性,標注實體后的代碼如下所示。
@Entity
@Table(name = "customer")
public class CustomerEO implements java.io.Serializable {
……
private CustomerType type;
@Enumerated(EnumType.STRING)
public CustomerType getType() {
return type;
}
public void setType(CustomerType type) {
this.type = type;
}
public enum CustomerType {
COMPETITOR, INVESTOR, PARTNER, VENDER
}
}
在實體中雖然標注成枚舉類型,但當實體持久化后,表中所對應的值仍舊是基本的數據類型,以上代碼創建表的SQL語句是:
CREATE TABLE customer (
id int(20) NOT NULL auto_increment,
name varchar(255),
type varchar(255),
PRIMARY KEY (id)
)
使用枚舉類型后,在創建實體時便可以直接引用枚舉類型,例如以下代碼所示。
CustomerEO customer = new CustomerEO();
customer.setName("Janet2");
customer.setType(CustomerType.PARTNER);
entityManager.persist(customer);
在使用@Enumerated注釋時,需要注意以下幾個問題:
l 因為枚舉類型的有名稱和值兩個屬性,所以在持久化時可以選擇持久化名稱或是持久化值。通過EnumType來定義,它有兩個值如下所示。
public enum EnumType {
ORDINAL,
STRING
}
ORDINAL表示持久化的為枚舉類型的值,STRING表示持久化的為枚舉類型的名稱。默認為ORDINAL,持久化值。例如以上示例中標注的為STRING,這樣持久化實體后,數據庫中保存的是枚舉類型的名稱,如圖所示。

若此時改成ORDINAL,代碼如下:
@Enumerated(EnumType.ORDINAL)
public CustomerType getType() {
return type;
}
則同樣持久化的實體后,數據庫保存的結果如圖所示。

l 如何選擇STRING和ORDINAL:
如果使用STRING保存,雖然從數據庫中查詢數據時非常直觀,能夠清楚的看出該類型代表意義,但這樣也會帶來其他的問題。若此時枚舉類型的定義改變,例如上例中的枚舉類型名稱改為:
public enum CustomerType {
CUST_COMPETITOR, INVESTOR, PARTNER, VENDER
}
則此時數據庫中保存的“COMPETITOR”的值將不能轉化為枚舉類型CustomerType中的“CUST_COMPETITOR”的值。但若使用ORDINAL則不會帶來這種問題。所以建議使用ORDINAL類型來持久化枚舉類型。
l 枚舉類型的定義位置,實體外部VS實體內部。
上例中CustomerType枚舉類型定義在CustomerEO實體內部,這是因為只有CustomerEO這個實體會使用CustomerType類型,其他的實體不會使用該類型。該類型與這個實體關系緊密聯系。
但若此時多個實體公用一個枚舉類型時,則可以將枚舉類型單獨定義,定義在實體的外部。有這樣一個枚舉類型BusinessLine,它定義在實體外部,代碼如下:
public enum BusinessLine {
REAL_ESTATE,FINANCE, NON_PROFIT
}
例如CustomerEO實體增加一個BusinessLine的枚舉類型,代碼如下所示。
@Entity
@Table(name = "customer")
public class CustomerEO implements java.io.Serializable {
……
private BusinessLine businessLine;
@Enumerated(EnumType.STRING)
public BusinessLine getBusinessLine() {
return businessLine;
}
public void setBusinessLine(BusinessLine businessLine) {
this.businessLine = businessLine;
}
}