【问题标题】:How to store enum type as lowercase string?如何将枚举类型存储为小写字符串?
【发布时间】:2013-11-02 01:20:20
【问题描述】:

我的模型课(片):

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

附:我使用休眠 jpa

感谢您的帮助!

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

【问题讨论】:

  • 您的代码对我有用。 toStringgetStatus 都返回小写字符串。你确定在构造json的时候没有调用name()
  • @Bittenus,我尝试将枚举作为小写字符串存储在数据库中。
  • 1.您是使用库来解析枚举还是自己解析它? 2. 解析数据库枚举的代码是使用name() 还是toString
  • 我使用下一个库:spring-orm、hibernate-core 和 hibernate-entitymanager
  • 接受的答案是唯一的方法。很遗憾,如果没有定义转换器,Spring 应该默认使用枚举 getter 和 setter

标签: java hibernate jpa enums persistence


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢你,肯特。这对我有帮助。只是为了完成,因为我必须搜索它:注释字段以使用转换器的工作方式如下:@Colum@Convert(converter=YourEnumConverter.class)
  • @Buka 对!另外请注意,如果使用@Convert,则应删除@Enumerated,否则将忽略转换器
【解决方案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
}

【讨论】:

    【解决方案3】:

    如果您将 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);
        }
    }
    

    【讨论】:

      【解决方案4】:

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

      我看到两个选项

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

      【讨论】:

      • 在 getter 方法中,我返回 Status 枚举。我将返回类型更改为 String 并将实现更改为返回 status.name().toLowerCase(),但仍然没有效果。对不起
      猜你喜欢
      • 2016-03-06
      • 1970-01-01
      • 2015-06-19
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 2018-02-14
      相关资源
      最近更新 更多