0

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) か何かが欲しいです。

どうもありがとうアンドレ

4

1 に答える 1

1

EclipseLink Converter インターフェースは、initialize(DatabaseMapping マッピング、セッション セッション) を定義します。フィールドに使用するタイプを設定するために使用できるメソッド。他の誰かが、ここでマッピングからフィールドを取得する方法を示す例を投稿しました: Using UUID with EclipseLink and PostgreSQL

DatabaseField の columnDefinition が設定されている場合、DDL 生成の型を定義するために使用される唯一のものになるため、慎重に設定してください。他の設定 (非 null、nullable など) は、columnDefinition が設定されていない場合にのみ使用されます。

于 2012-11-12T16:47:43.133 に答える