使用JPA(EclipseLink)和自定义转换器将postgreSQL枚举映射到Java枚举

时间:2013-02-14 22:07:57

标签: postgresql jpa enums eclipselink

我正在尝试使用JPA(EclipseLink提供程序)将postgreSQL ENUM类型映射到Java枚举类型(反之亦然)。

我知道我可以使用varchar注释轻松地将Java枚举映射到我的postgreSQL数据库中的@Enumerated类型,但我想将其映射到postgreSQL ENUM tpye中。我想我必须使用自定义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;

感谢您的解释,我在Google上搜索了EclipseLink的自定义转换器,但这次谷歌不是我的朋友。

1 个答案:

答案 0 :(得分:3)

好的,我在另一个项目中使用基本的SELECT语句进行了一些测试,我看到我的postgreSQL ENUM类型返回为PGObject,其值设置为my ENUM的值(在我的情况下FRENDE)以及我的枚举名称的类型。

例如:如果我在pg:

中创建以下ENUM
CREATE TYPE langage AS ENUM ('FR', 'EN', 'DE');

我会收到价值为PGObjectFREN且类型为DE的{​​{1}}。

因此,当我想将Java对象转换为langage时,我只需创建一个自定义EclipseLink ENUM并在Converter中返回PGObject这样的内容:< / p>

convertObjectValueToDataValue

这很棒。

希望这有帮助。