3

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

我知道我可以varchar使用注释轻松地将 Java 枚举映射到我的 postgreSQL 数据库中的类型,@Enumerated但我想将它映射到 postgreSQL ENUMtpye 中。我想我必须使用自定义的 EclipseLink 转换器来做到这一点。

所以,我开始实现 aorg.eclipse.persistence.mappings.converters.Converter但我不知道如何实现 the convertObjectValueToDataValue, theinitializeisMutable方法......

有人可以解释一下如何实现这些方法吗?

现在,我的课是这个:

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 的自定义转换器,但这次 Google 不是我的朋友。

4

1 回答 1

3

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

ENUM例如:如果我在 pg 中创建以下内容:

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

我将收到PGObjectvalueFRENorDE和 type 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 回答