3

私はJPA(EclipseLinkプロバイダー)でpostgreSQLENUM型をJava列挙型に(またはその逆に)マッピングしようとしています。

varcharJava列挙型をpostgreSQLデータベースの型にアノテーションを付けて簡単にマップできることは知っていますが、 postgreSQLtpye@Enumeratedにマップしたいと思います。ENUMこれを行うには、カスタムEclipseLinkコンバーターを使用する必要があると思います。

だから、私は実装を始めましたが、、、およびメソッドorg.eclipse.persistence.mappings.converters.Converterを実装する方法がわかりません...convertObjectValueToDataValueinitializeisMutable

誰かがこれらのメソッドを実装する方法を教えてもらえますか?

今のところ、私のクラスはこれです:

public class EnumConverter implements Converter {

private static final long serialVersionUID = 1L;

public Object convertDataValueToObjectValue(Object object, Session session) {

    if(object instanceof PGobject){
        return LangageEnum.valueOf(LangageEnum.class, ((PGobject)object).getValue());           
    }

    return null;
}

public Object convertObjectValueToDataValue(Object object, Session session) {
    // WHAT HERE...?
    // I tried to play with PGObject witout success...
    return object;
}

public void initialize(DatabaseMapping arg0, Session arg1) {
    // WHAT INITIALIZATION HERE...?
}

public boolean isMutable() {
    // TRUE OR FALSE AND WHY...?
    return false;
}

}

@Converter(name="langageConverter", converterClass=EnumConverter.class)
@Convert(value="langageConverter")
private LangageEnum langage;

説明ありがとうございます。EclipseLinkwithGoogleのカスタムコンバーターを検索しましたが、今回はGoogleが私の友達ではありませんでした。

4

1 に答える 1

3

OK、別のプロジェクトで基本的な SELECT ステートメントを使用していくつかのテストを行ったところ、postgreSQL 型が myの値(私の場合は 、または)に設定された値と、列挙型の名前の型ENUMで返されることがわかりました。PGObjectENUMFRENDE

例:ENUMpgで次を作成した場合:

CREATE TYPE langage AS ENUM ('FR', 'EN', 'DE');

PGObjectFRまたはENまたはDEおよびタイプで受け取りますlangage

したがって、Java オブジェクトを自分の に変換したい場合はENUM、カスタム EclipseLinkConverterを作成し、次のPGObjectようにconvertObjectValueToDataValue

public class EnumConverter implements Converter {

private static final long serialVersionUID = 1L;

private static Logger logger = Logger.getLogger(EnumConverter.class);

public Object convertDataValueToObjectValue(Object object, Session session) {

    if(object instanceof PGobject){
        return LangageEnum.valueOf(LangageEnum.class, ((PGobject)object).getValue());           
    }

    return null;
}

public Object convertObjectValueToDataValue(Object object, Session session) {

    if(object instanceof LangageEnum){

        PGobject pg = new PGobject();

        try {
            pg.setValue(((LangageEnum)object).name());
            pg.setType("langage");
        } catch (SQLException e) {
            logger.log(Level.FATAL, e);
        }

        return pg;
    }

    return object;
}

public void initialize(DatabaseMapping dm, Session session) {
    dm.getField().setSqlType(Types.OTHER);
}

public boolean isMutable() {
    return true;
}

}

そしてそれは素晴らしい仕事です。

お役に立てれば。

于 2013-02-15T11:51:49.920 に答える