如何使用JPA将MySQL枚举映射到Java枚举?

时间:2019-05-22 13:56:21

标签: java mysql hibernate jpa spring-data-jpa

我有一个使用MySQL原生枚举值的MySQL表:

CREATE TABLE users (
  id int NOT NULL AUTO_INCREMENT,
  status enum('PENDING', 'ACTIVE', 'INACTIVE') NOT NULL
);

我想通过JPA在Spring Boot中访问它,因此我将其建模为具有enum属性的实体。

public enum Status {
    PENDING,
    ACTIVE,
    INACTIVE;
}

@Entity
@Table(name = "users")
public class User {
    @Id
    @Column
    private int id;

    @Column
    @Enumerated(EnumType.STRING)
    private Status status;

    /* Getters, Setters,… */
}

启动应用程序时,我遇到ddl-auto属性设置为validate的情况,我期望模式验证会出错:

  

org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [status] in table [users]; found [enum (Types#CHAR)], but expecting [varchar(255) (Types#VARCHAR)]

在JPA中使用MySQL枚举必须做什么?

1 个答案:

答案 0 :(得分:2)

要使Hibernate可以正确地与本机MySQL枚举列一起使用,您需要为它提供该列正确DDL的明确提示,而不是让它推迟类型。为此,您可以为实体中的列定义columnDefinition

public enum Status {
    PENDING,
    ACTIVE,
    INACTIVE;
}

@Entity
@Table(name = "users")
public class User {
    @Id
    @Column
    private int id;

    @Column(columnDefinition = "ENUM('PENDING', 'ACTIVE', 'INACTIVE')")
    @Enumerated(EnumType.STRING)
    private Status status;

    /* … */
}

如果您使用AttributeConverters将MySQL枚举映射到Java枚举,则这也适用。