【问题标题】:How to map a MySQL enum to a Java Enum with JPA? [duplicate]如何使用 JPA 将 MySQL 枚举映射到 Java 枚举? [复制]
【发布时间】: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 枚举做什么?

【问题讨论】:

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


    【解决方案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 枚举,这也适用。

    【讨论】:

      猜你喜欢
      • 2018-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-14
      • 2014-02-21
      • 2013-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多