【问题标题】:EclipseLink converts Enum to BigDecimalEclipseLink 将 Enum 转换为 BigDecimal
【发布时间】:2012-11-09 11:41:37
【问题描述】:

我尝试使用 EclipseLink 的转换器将 Enum 转换为 BigDecimal。转换有效,但生成的数据库列具有字符串类型。是否可以设置一个参数,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)之类的。

非常感谢 安德烈

【问题讨论】:

    标签: enums eclipselink converter bigdecimal column-types


    【解决方案1】:

    EclipseLink Converter接口定义了一个initialize(DatabaseMapping mapping, Session session);可用于设置用于字段的类型的方法。其他人在此处发布了一个示例,展示了如何从映射中获取字段:Using UUID with EclipseLink and PostgreSQL

    DatabaseField 的 columnDefinition,如果设置,将是唯一用于定义 DDL 生成类型的东西,因此请谨慎设置。仅当未设置 columnDefinition 时才会使用其他设置(非 null、可为 null 等)。

    【讨论】:

      猜你喜欢
      • 2011-05-01
      • 1970-01-01
      • 2013-08-26
      • 2012-09-05
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      • 2022-09-23
      • 2016-07-23
      相关资源
      最近更新 更多