如何使用 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) 列映射到实例变量?