在Java中Enum
是一种“奇葩”的存在,“奇葩”不代表没用,对于这种比较特殊的存在,hibernate会有很多种选择来完成Enum类型字段的映射,首先要说明的是在hibernate都是把Enum
类型的字段映射成基本类型的字段,并且我这里不使用任何配置文件来配置映射,而是统一使用注解这种方式来完成映射。
注意本文使用的数据库是MySQL5.7,版本和数据库类型可能会有不同的结果。
首先我们要明确的是将Enum类型的字段映射到数据库中有两种方式:
- 一个是通过使用Enum类型实例在Enum中声明的顺序,也就是
ordinal
属性,通过这个序号来将Enum类型字段映射成int类型来存储; - 一个是通过使用Enum类型实例中的
name
属性来完成映射,这里讲Enum类型映射成String类型来完成存储;
这两个属性其实都在java.lang.Enum
中,这个类是所有Enum类型的父类。
1. 不使用任何注解
当不使用任何注解的时候,默认情况下是使用ordinal
属性,也就是Enum类型实例在Enum中声明的顺序来完成映射的,具体情况如下:
@Entity
public class Person implements Serializable{
private static final long serialVersionUID = 8849870114127659929L;
@Id
@GeneratedValue
private Long id;
@Column(nullable = false)
private String name;
@Column
private Gender gender;
public Person(String name, Gender gender){
this.name = name;
this.gender = gender;
}
// getter、setter
}
这里Gender就是我们的Enum类,如下:
public enum Gender {
male("男"),
female("女");
private String name;
private