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