JPA EnumType.STRING - 错误键值

时间:2017-10-27 17:00:03

标签: spring-data-jpa

我正在构建一个Spring数据层来处理遗留数据库。使用@Enumerated注释某些字段的功能是新的,但对于我正在使用的模式非常有用,其中有许多参考数据表定义从国家/地区到系统代码的所有内容。这些表中的大多数都是非常规则的结构。它们具有关键字段,名称和描述。但是,有时键字段不是有效的Java标识符。因此,我不能将@Enumerated与EnumType.STRING类型一起使用。这似乎是一个奇怪的棘手问题。有没有解决方法?

1 个答案:

答案 0 :(得分:0)

我发现答案是使用AttributeConverter,它具有额外的优势,即使用它的实体不必将该字段注释为枚举。完整的代码示例如下:

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

public enum RefExample {

  GOOD_VALUE("Data good key value", "The key for this record is GOOD_VALUE, a valid Java identifier"),
  _1_DAY_AT_A_TIME("Data with bad key value", "The key for this record is not a valid Java id", "1_DAY_AT_A_TIME");

  private final String name;
  private final String description;
  private final String dbString;

  RefExample(String name, String description) {
      this(name, description, null);
  }

  RefExample(String name, String description, String dbString) {
      this.name = name;
      this.description = description;
      this.dbString = dbString;
  }

  public String getName() {
      return name;
  }

  public String getDescription() {
      return description;
  }

  public String toDbString() {
      return dbString == null ? name() : dbString;
  }

  public static RefExample fromDbString(String dbString) {
      for (RefExample value : values()) {
          if (value.toDbString().equalsIgnoreCase(dbString)) {
              return value;
          }
      }

      return null;
  }

  @Converter(autoApply = true)
  public static class RefExampleConverter implements AttributeConverter<RefExample, String> {
      @Override
      public String convertToDatabaseColumn(RefExample code) {
          return code.toDbString();
      }

      @Override
      public RefExample convertToEntityAttribute(String dbString) {
          return fromDbString(dbString);
      }
  }
}