【问题标题】:Map postgreSQL enum to Java enum with JPA (EclipseLink) and custom converter使用 JPA (EclipseLink) 和自定义转换器将 postgreSQL 枚举映射到 Java 枚举
【发布时间】:2013-01-30 20:27:58
【问题描述】:

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

我知道我可以使用 @Enumerated 注释轻松地将 Java 枚举映射到我的 postgreSQL 数据库中的 varchar 类型,但我想将它映射到 postgreSQLENUM 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 的自定义转换器,但这次 Google 不是我的朋友。

【问题讨论】:

    标签: postgresql jpa enums eclipselink


    【解决方案1】:

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

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

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

    我将收到PGObject,其值为FRENDE,类型为langage

    因此,当我想将 Java 对象转换为我的 ENUM 时,我只需创建一个自定义 EclipseLink Converter 并在 convertObjectValueToDataValue 中返回一个像这样的 PGObject

    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;
    }
    
    }
    

    而且效果很好。

    希望这会有所帮助。

    【讨论】:

    • 可能变化不大,但isMutable()不应该为ENUM类型返回false
    猜你喜欢
    • 2018-04-11
    • 2013-01-29
    • 1970-01-01
    • 2019-10-09
    • 2015-03-04
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多