我有一些属性,例如用户对象上的枚举:

@Column(name = "user_status")
private UserStatus userStatus;


其中UserStatus为:

public enum UserStatus {
    NONE(0),
    MEMBER(1),
    PENDING(2);

    private long enumValue;

    UserStatus(long permissionValue) {
        this.enumValue = permissionValue;
    }

    public long getEnumValue() {
        return enumValue;
    }

    public void setEnumValue(long enumValue) {
        this.enumValue = enumValue;
    }
}


在数据库(mysql)中,UserStatus列为:

user_status int(11) NOT NULL


我很困惑,这怎么运作?休眠足够聪明来映射吗?

最佳答案

JPA规范定义了嵌入式枚举的行为,允许将它们存储为基于整数的序数或字符串表示形式。默认行为是将枚举存储为整数序数。您可以通过@Enumerated注释控制此行为。在您的示例中,以下操作将导致您的JPA提供程序在DDL中生成varchar类型:

@Column(name = "user_status")
@Enumerated(STRING)
private UserStatus userStatus;


附带说明一下,在我看来,将整数序数存储在数据库中是一个可怕的想法,因为如果重新排序/更改枚举成员,则数据将变成垃圾。

参考:JPA 2.0 Specification-第11.1.16节

09-27 10:49