EclipseLink の Converter を使用して Enum を BigDecimal に変換しようとしています。変換は機能しますが、結果のデータベース列の型は String になります。EclipseLink がデータベース内に 10 進列タイプを作成するようにパラメーターを設定することは可能ですか?
org.eclipse.persistence.mappings.converters.Converter を実装するクラスを使用します。
アプリケーション サーバーのログ
デフォルトのテーブル ジェネレーターは、データベース フィールド (xyz) の Java 型 (null) を検索またはデータベース型に変換できませんでした。ジェネレーターは、フィールドのデフォルトの Java タイプとして java.lang.String を使用します。
このメッセージは、コンバーターを使用するすべてのフィールドに対して生成されます。これらのフィールドに特定のデータベース タイプを定義するにはどうすればよいですか?
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) {
}
}
SQLジェネレーターはデータベース列をvarchar(255)として定義するため、convertDataValueToObjectValue(Object
使用する必要があります。String
私は decimal(15,2) か何かが欲しいです。
どうもありがとうアンドレ