Я пытаюсь преобразовать Enum в BigDecimal, используя конвертер EclipseLink. Преобразование работает, но результирующий столбец базы данных имеет тип String. Можно ли установить параметр, который EclipseLink создает десятичный тип столбца в базе данных?
Я использую класс, реализующий org.eclipse.persistence.mappings.converters.Converter.
Журналы сервера приложений
Генератор таблиц по умолчанию не смог найти или преобразовать тип java (null) в тип базы данных для поля базы данных (xyz). Генератор использует java.lang.String как тип java по умолчанию для поля.
Это сообщение генерируется для каждого поля, в котором используется конвертер. Как я могу определить конкретный тип базы данных для этих полей?
public enum IndirectCosts {
EXTENDED {
public BigDecimal getPercent() {
return new BigDecimal("25.0");
}
},
NORMAL {
public BigDecimal getPercent() {
return new BigDecimal("12.0");
}
},
NONE {
public BigDecimal getPercent() {
return new BigDecimal("0.0");
}
};
public abstract BigDecimal getPercent();
public static IndirectCosts getType(BigDecimal percent) {
for (IndirectCosts v : IndirectCosts.values()) {
if (v.getPercent().compareTo(percent) == 0) {
return v;
}
}
throw new IllegalArgumentException();
}
}
База данных должна хранить числовые значения. Я использую такой преобразователь:
public class IndirectCostsConverter implements Converter {
@Override
public Object convertObjectValueToDataValue(Object objectValue, Session session) {
if (objectValue == null) {
return objectValue;
} else if (objectValue instanceof IndirectCosts) {
return ((IndirectCosts) objectValue).getPercent();
}
throw new TypeMismatchException(objectValue, IndirectCosts.class);
}
@Override
public Object convertDataValueToObjectValue(Object dataValue, Session session) {
if (dataValue == null) {
return dataValue;
} else if (dataValue instanceof String) {
return IndirectCosts.getType(new BigDecimal((String) dataValue));
}
throw new TypeMismatchException(dataValue, BigDecimal.class);
}
@Override
public boolean isMutable() {
return false;
}
@Override
public void initialize(DatabaseMapping databaseMapping, Session session) {
}
}
Внутри convertDataValueToObjectValue(Object
я должен использовать String
, потому что генератор SQL определяет столбец базы данных как varchar(255). Я хотел бы иметь десятичное число (15,2) или что-то в этом роде.
Большое спасибо Андре