對於枚舉類型,不能經過org.hibernate.annotations.Type註解來簡單的映射對應的數據庫字段類型(除非自定義類型)。對此,Hibernate提供了javax.persistence.Enumerated註解,該註解的參數有兩種場景:java
1.EnumType.STRING:使用該參數時,數據庫表中會存儲枚舉的字符串值;mysql
2.EnumType.ORDINAL:使用該參數時,數據庫表中存在的是枚舉的int型值;sql
假如在數據類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註解來配置映射關係:ide
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屬性:this
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:spa
mysql> select name, type from movie; +------------------+------+ | name | type | +------------------+------+ | 速度與激情8 | 2 | +------------------+------+ 1 row in set (0.00 sec)
若是@Enumerated註解參數配置的是EnumType.STRING,則數據庫中會存放枚舉對應的字符串值:hibernate
mysql> select name, type from movie; +------------------+---------+ | name | type | +------------------+---------+ | 速度與激情8 | CARTOON | +------------------+---------+ 1 row in set (0.00 sec)
經過@Enumerated存儲在數據庫中的值是固定的,是不可定製的,假如枚舉類MovieType聲明以下:code
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註解並不僅能用來匹配註解,它能夠用在任何類型的數據上,譬如,能夠將一個集合中的內容以空格分隔存在數據庫中,讀出時以空格分隔從新生成爲一個集合等。