我尝试使用ConverterLink的Converter将Enum转换为BigDecimal。转换有效,但生成的数据库列具有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)或其他东西。
非常感谢 安德烈
答案 0 :(得分:1)
EclipseLink Converter接口定义了一个初始化(DatabaseMapping映射,Session会话);可用于设置要用于字段的类型的方法。其他人发布了一个示例,说明如何从映射中获取字段:Using UUID with EclipseLink and PostgreSQL
DatabaseField的columnDefinition(如果设置)将是唯一用于定义DDL生成类型的东西,因此请仔细设置它。只有在未设置columnDefinition时才会使用其他设置(非null,可空等)。