EclipseLink преобразует Enum в BigDecimal

Я пытаюсь преобразовать 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) или что-то в этом роде.

Большое спасибо Андре


person witchi    schedule 09.11.2012    source источник


Ответы (1)


Интерфейс EclipseLink Converter определяет инициализацию (отображение DatabaseMapping, сеанс сеанса); метод, который можно использовать для установки типа, используемого для поля. Кто-то еще опубликовал пример, показывающий, как получить поле из сопоставления здесь: Использование UUID с EclipseLink и PostgreSQL

Параметр columnDefinition в DatabaseField, если он установлен, будет единственным, что будет использоваться для определения типа для генерации DDL, поэтому устанавливайте его тщательно. Другие настройки (не null, nullable и т. д.) будут использоваться только в том случае, если значение columnDefinition не задано.

person Chris    schedule 12.11.2012