Hibernate @Enumerated標注枚舉類型解說


實體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         如何選擇STRINGORDINAL

如果使用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;

         }

}


免責聲明!

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



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