如何使用 JPA 将 MySQL 枚举映射到 Java 枚举? [复制]

Posted

技术标签:

【中文标题】如何使用 JPA 将 MySQL 枚举映射到 Java 枚举? [复制]【英文标题】:How to map a MySQL enum to a Java Enum with JPA? [duplicate] 【发布时间】:2019-10-09 01:03:53 【问题描述】:

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

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

我想通过 JPA 在 Spring Boot 中访问它,所以我将它建模为具有枚举属性的实体。

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】:

要使 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 枚举,这也适用。

【讨论】:

以上是关于如何使用 JPA 将 MySQL 枚举映射到 Java 枚举? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JPA 和 Hibernate 将 MySQL JSON 列映射到 Java 实体属性

如何使用 JPA/Hibernate 注释将 MySQL char(n) 列映射到实例变量?

使用JPA将嵌套枚举保存到db

将名为 EMPLOYEE 的枚举映射到 VARCHAR 鉴别器值“M”

Grails:将枚举类型的mysql字段映射到域类

使用 JPA 2.1,我如何将本机查询结果映射到 @Transient 字段(taht is a Set)?