Sealyu

          --- 博客已遷移至: http://www.sealyu.com/blog

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            618 隨筆 :: 87 文章 :: 225 評論 :: 0 Trackbacks

          實體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;

                   }

          }

          posted on 2009-06-30 13:18 seal 閱讀(3801) 評論(0)  編輯  收藏 所屬分類: Hibernate數據庫EJB
          主站蜘蛛池模板: 博野县| 凌云县| 盘锦市| 东明县| 永仁县| 宁明县| 金溪县| 平潭县| 余姚市| 岑巩县| 余干县| 秦安县| 平和县| 龙门县| 曲靖市| 西藏| 太仆寺旗| 德格县| 平和县| 临颍县| 宜宾市| 和平区| 土默特左旗| 乐都县| 喀什市| 庄河市| 宁蒗| 张掖市| 定陶县| 曲阳县| 两当县| 江川县| 祁阳县| 突泉县| 新乐市| 上犹县| 米脂县| 阿城市| 金堂县| 巨鹿县| 祁门县|