16

我的模型班(片):

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

PS我使用休眠jpa

感谢帮助!

PSS 我问是因为我编写了生成 json 的 REST 服务(在 json 对象中最好使用小写,如果我没记错的话)

4

4 回答 4

13

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

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

在那里你可以应用你的大写/小写逻辑。

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

于 2014-01-28T13:26:30.783 回答
6

这是一个快速实用的使用示例(在 JPA 2.1 中引入)AttributeConverter

更新您的枚举类:

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
}
于 2018-10-15T14:31:38.280 回答
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);
    }
}
于 2020-11-04T09:11:50.153 回答
0

最佳实践是使用大写的枚举常量。

我看到两个选项

  1. 在枚举中使用小写(不是一个好习惯)
  2. 使用此枚举更改 bean 的 getter 方法(getStatus 方法)以返回小写。(最好的选择)
于 2013-10-23T16:37:08.390 回答