Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Enums EclipseLink将枚举转换为BigDecimal_Enums_Eclipselink_Converter_Bigdecimal_Column Types - Fatal编程技术网

Enums EclipseLink将枚举转换为BigDecimal

Enums EclipseLink将枚举转换为BigDecimal,enums,eclipselink,converter,bigdecimal,column-types,Enums,Eclipselink,Converter,Bigdecimal,Column Types,我尝试使用EclipseLink的转换器将枚举转换为BigDecimal。转换工作正常,但生成的数据库列具有字符串类型。是否可以设置EclipseLink在数据库中构建十进制列类型的参数 我使用一个类,它实现org.eclipse.persistence.mappings.converters.Converter 应用程序服务器记录日志 默认表生成器无法为数据库字段(xyz)定位java类型(null)或将其转换为数据库类型。生成器使用java.lang.String作为字段的默认java类型

我尝试使用EclipseLink的转换器将枚举转换为BigDecimal。转换工作正常,但生成的数据库列具有字符串类型。是否可以设置EclipseLink在数据库中构建十进制列类型的参数

我使用一个类,它实现org.eclipse.persistence.mappings.converters.Converter

应用程序服务器记录日志

默认表生成器无法为数据库字段(xyz)定位java类型(null)或将其转换为数据库类型。生成器使用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)或其他形式

非常感谢
Andre

EclipseLink Converter接口定义了一个initialize(数据库映射,会话会话);方法,您可以使用该方法设置要用于字段的类型。其他人在此处发布了一个示例,展示了如何从映射中获取字段:

DatabaseField的columnDefinition(如果设置)将是唯一用于定义DDL生成类型的内容,因此请仔细设置。只有在columnDefinition未设置的情况下,才会使用其他设置(NOTNULL、nullable等)