天天看點

JPA注解@Enumerated映射枚舉字段

在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();