在javax.persistence包中有這麼兩個註解@Enumerated,@EnumType
*/
@Target({METHOD, FIELD})
@Retention(RUNTIME)
public @interface Enumerated {
/** (Optional) The type used in mapping an enum type. */
EnumType value() default ORDINAL;
}
public enum EnumType {
/** 持久枚舉類型字段爲整數,元素一般從0開始索引. */
ORDINAL,
/** 持久枚舉類型爲字符串. */
STRING
}
當我需要持久化一個枚舉類字段的時候,就可以用@Enumerated來標註枚舉類型。來舉個栗子:
數據庫中有一張employee表
對應的Employee實體
@Entity
@Table(name = "employee", schema = "public")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
@Id
@GeneratedValue
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name;
@Column(name = "sex")
@Enumerated(EnumType.ORDINAL)//性別字段持久化爲0,1
private Sex sex;
@Column(name = "type")
@Enumerated(EnumType.STRING)//枚舉字符串
private Type type;
}
Sex枚舉類:
public enum Sex {
MAIL("男"),
FMAIL("女");
private String value;
private Sex(String value) {
this.value = value;
}
}
Type枚舉類:
public enum Type {
PROGRAMMER("開發"),
PM("項目經理"),
TESTERS("測試"),
UI("妹子"),
;
private String type;
private Type(String type) {
}
}
那現在我們來看一下插入幾條數據看下是什麼效果。
EmployeeRepostory employeeRepostory = context.getBean(EmployeeRepostory.class);
Employee fireYao = Employee.builder().name("fireYao").sex(Sex.MAIL).type(Type.PROGRAMMER).build();
Employee gakki = Employee.builder().name("gakki").sex(Sex.FMAIL).type(Type.UI).build();
Employee whoever = Employee.builder().name("whoever").sex(Sex.FMAIL).type(Type.PM).build();
employeeRepostory.save(Arrays.asList(fireYao,gakki,whoever));
插入數據後,數據庫中:
可以看到,sex字段被持久化爲0,1這樣的int字段,因爲在sex字段上標註了@Enumerated(EnumType.ORDINAL)
,那這樣持久化到數據庫時,就會根據枚舉類中的字段,依次從0開始標記,Sex中MAIL(“男”)就爲0,FMAIL(“女”)就爲1,根據枚舉類的字段個數依次遞增。
在type字段上標註了@Enumerated(EnumType.STRING)
,就直接根據枚舉類的字段字符串來自動持久化到數據庫。
如果枚舉字段上不加註解,那麼枚舉字段就會被默認映射爲 int 類型存儲。
那現在我們來看查詢一下的結果。
List<Employee> all = employeeRepostory.findAll();
可以看到,查詢出來的結果中sex字段又自動還原成了Sex枚舉字段。