1. 程式人生 > >Hibernate學習筆記(三) --- 映射枚舉類型

Hibernate學習筆記(三) --- 映射枚舉類型

enume rto 希望 enum 類名 賦值 rom cart org

對於枚舉類型,不能通過org.hibernate.annotations.Type註解來簡單的映射對應的數據庫字段類型(除非自定義類型)。對此,Hibernate提供了javax.persistence.Enumerated註解,該註解的參數有兩種場景:

  1.EnumType.STRING:使用該參數時,數據庫表中會存儲枚舉的字符串值;

  2.EnumType.ORDINAL:使用該參數時,數據庫表中存在的是枚舉的int型值;

假如在數據類Movie.java中新增一個type字段,該字段被定義為枚舉類型MovieType,用於標識該影視是電影、電視劇還是動漫。枚舉MovieType代碼如下:

 1 package study.hibernate.model;
 2 
 3 public enum MovieType {
 4     FILM, 
 5     
 6     TV, 
 7     
 8     CARTOON, 
 9     
10     VARIETY
11 }

在數據類中對type屬性添加@Enumerated註解來配置映射關系:

 1 package study.hibernate.model;
 2 
 3 import javax.persistence.Column;
 4 import javax.persistence.Convert;
5 import javax.persistence.Entity; 6 import javax.persistence.EnumType; 7 import javax.persistence.Enumerated; 8 import javax.persistence.Id; 9 import javax.persistence.Table; 10 11 import org.hibernate.annotations.Type; 12 13 /** 14 * 電影數據類 15 * 16 */ 17 @Entity 18 @Table(name="MOVIE") 19 public
class Movie { 20 @Id 21 @Column(name="MOVIE_ID") 22 private int id; 23 24 @Column(name="NAME") 25 @Type(type="string") 26 private String name; 27 28 @Column(name="DESCRIPTION") 29 @Type(type="text") 30 private String description; 31 32 @Column(name="TYPE") 33 @Enumerated(EnumType.ORDINAL) 34 private MovieType type; 35 36 public int getId() { 37 return id; 38 } 39 40 public void setId(int id) { 41 this.id = id; 42 } 43 44 public String getName() { 45 return name; 46 } 47 48 public void setName(String name) { 49 this.name = name; 50 } 51 52 public String getDescription() { 53 return description; 54 } 55 56 public void setDescription(String description) { 57 this.description = description; 58 } 59 60 public MovieType getType() { 61 return type; 62 } 63 64 public void setType(MovieType type) { 65 this.type = type; 66 } 67 68 }

在應用啟動時,設置對應的type屬性:

            Movie movie = new Movie();
            movie.setId(1);
            movie.setName("速度與激情8");
            movie.setDescription("多米尼克(範·迪塞爾 Vin Diesel 飾)與萊蒂(米歇爾·羅德裏格茲 Michelle Rodriguez 飾)共度蜜月,布萊恩與米婭退出了賽車界,這支曾環遊世界的頂級飛車家族隊伍的生活正漸趨平淡。然而,一位神秘女子Cipher(查理茲·塞隆 Charlize T heron 飾)的出現,令整個隊伍卷入信任與背叛的危機,面臨前所未有的考驗。");
            movie.setType(MovieType.CARTOON);

運行後,查看數據庫,發現movie表中的type字段被賦值2:

mysql> select name, type from movie;
+------------------+------+
| name             | type |
+------------------+------+
| 速度與激情8      |    2 |
+------------------+------+
1 row in set (0.00 sec)

如果@Enumerated註解參數配置的是EnumType.STRING,則數據庫中會存放枚舉對應的字符串值:

mysql> select name, type from movie;
+------------------+---------+
| name             | type    |
+------------------+---------+
| 速度與激情8      | CARTOON |
+------------------+---------+
1 row in set (0.00 sec)

通過@Enumerated存儲在數據庫中的值是固定的,是不可定制的,假如枚舉類MovieType聲明如下:

 1 package study.hibernate.model;
 2 
 3 public enum MovieType {
 4     FILM("電影"), 
 5     
 6     TV("連續劇"), 
 7     
 8     CARTOON("動漫"), 
 9     
10     VARIETY("綜藝");
11     
12     private String type;
13     
14     private MovieType(String type) {
15         this.type = type;
16     }
17 
18     @Override
19     public String toString() {
20         return type;
21     }
22 }

對於如上枚舉,希望如果類型為MovieType.CARTOON時,存在數據庫中的值為"動漫",如果類型為MovieType.FILM,存在數據庫中的值為"電影"。此時@Enumerated的功能是不夠的,可以通過指定@Convert註解聲明對應的轉換類來實現。

@Convert註解用來聲明對象在寫到數據庫的時候怎麽轉換為數據庫可識別的類型,從數據庫中讀出來的時候怎麽反轉為對象,可以看作是一個序列化及反序列化的規則。

要使用@Convert註解,首先得定義一個實現了javax.persistence.AttributeConverter<X, Y>接口的類,該接口有兩個方法:

  javax.persistence.AttributeConverter.convertToDatabaseColumn(X) 用來說明如何把java對象X轉換存儲在數據庫中的數據對象Y;

  javax.persistence.AttributeConverter.convertToEntityAttribute(Y) 用來說明如何把數據庫中的數據對象Y轉換為對應的java對象X;

假如我們的實現類名為MovieTypeConvertor,代碼如下:

 1 package study.hibernate.model;
 2 
 3 import javax.persistence.AttributeConverter;
 4 
 5 public class MovieTypeConvertor implements AttributeConverter<MovieType, String> {
 6 
 7     public String convertToDatabaseColumn(MovieType attribute) {
 8         return String.valueOf(attribute);
 9     }
10 
11     public MovieType convertToEntityAttribute(String dbData) {
12         return MovieType.valueOf(dbData);
13     }
14 
15 }

其次,在數據庫Movie.java的type屬性上添加@Covert註解

1     @Column(name="TYPE")
2     @Convert(converter=MovieTypeConvertor.class)
3     private MovieType type;

最後,運行程序,查看數據庫中的值,發現數據的值已經被設置為”動漫“

mysql> select name, type from movie;
+------------------+--------+
| name             | type   |
+------------------+--------+
| 速度與激情8      | 動漫   |
+------------------+--------+
1 row in set (0.00 sec)

@Convert註解並不只能用來匹配註解,它可以用在任何類型的數據上,譬如,可以將一個集合中的內容以空格分隔存在數據庫中,讀出時以空格分隔重新生成為一個集合等。

Hibernate學習筆記(三) --- 映射枚舉類型