如何将枚举类型存储为小写字符串?

时间:2013-10-23 16:27:23

标签: java hibernate jpa enums persistence

我的模特课(作品):

public class User ... {

    @Enumerated(STRING)
    private Status status;

    ...

    public enum Status {

        ACTIVE,
        INACTIVE;

        @Override
        public String toString() {
            return this.name().toLowerCase();
        }
    }

    ...

    public String getStatus() {
        return status.name().toLowerCase();
    }

    public void setStatus(Status status) {
        this.status = status;
    }
}

如上所述,我重写了toString方法,但没有效果。 枚举在数据库中存储为ACTIVEINACTIVE

P.S。我使用hibernate jpa

感谢您的帮助!

P.S.S。我问,因为我写了生成json的REST服务(在json对象中更好地使用小写,如果我没有错的话)

5 个答案:

答案 0 :(得分:9)

编写一个converter类,注释为@Converter,实现javax.persistence.AttributeConverter<YourEnum, String>。有两种方法:

public String convertToDatabaseColumn(YourEnum attribute){..}
public YourEnum convertToEntityAttribute(String dbData) {..}

你可以应用大/小写逻辑。

稍后您可以使用给定的转换器注释您的字段。

答案 1 :(得分:2)

这是使用AttributeConverter (在JPA 2.1中引入)

的快速实用的示例。

更新您的枚举类:

public enum Status {
    ACTIVE,
    INACTIVE;

    public String toDbValue() {
        return this.name().toLowerCase();
    }

    public static Status from(String status) {
        // Note: error if null, error if not "ACTIVE" nor "INACTIVE"
        return Status.valueOf(status.toUpperCase());
    }
}

创建属性转换器:

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

@Converter(autoApply = true)
public class StatusConverter implements AttributeConverter<Status, String> {
    @Override
    public String convertToDatabaseColumn(Status status) {
        return status.toDbValue();
    }

    @Override
    public Status convertToEntityAttribute(String dbData) {
        return Status.from(dbData);
    }
}

如果autoApply设置为true,则无需将javax.persistence.Convert注释添加到所有应转换的属性中。否则,请应用转换器:

import javax.persistence.Convert;
import javax.persistence.Entity;

@Entity
public class User {

    @Convert(converter = StatusConverter.class)
    @Enumerated(STRING)
    private Status status;

    // ... other fields, constructor(s), standard accessors
}

答案 2 :(得分:1)

如果您将Jackson用于REST服务,请让Jackson在REST边界进行转换。您的问题没有说明数据库存储小写字母或应用程序处理小写字母的要求。

public enum Status {
    STARTED,
    CONSUMING,
    GENERATING,
    FAILED,
    COMPLETED,
    DELETED;

    /**
     * Serialises to and from lower case for jackson.
     *
     * @return lower case Status name.
     */
    @JsonValue
    public String toLower() {
        return this.toString().toLowerCase(Locale.ENGLISH);
    }
}

答案 3 :(得分:0)

最佳做法是使用大写枚举常量。

我看到两个选项

  1. 在枚举中使用小写(不是一个好习惯)
  2. 使用此枚举更改bean的getter方法(getStatus方法)以返回小写。 (最好的选择)

答案 4 :(得分:0)

您可以将User类中的字段定义为String。当您将实体保存到存储库时,请使用enum类来验证值:

User user = new User(Status.valueOf(status.toUpperCase()).toString().toLowerCase())