我正在尝试使用JPA(EclipseLink
提供程序)将postgreSQL ENUM
类型映射到Java枚举类型(反之亦然)。
我知道我可以使用varchar
注释轻松地将Java枚举映射到我的postgreSQL数据库中的@Enumerated
类型,但我想将其映射到postgreSQL ENUM
tpye中。我想我必须使用自定义EclipseLink转换器才能做到这一点。
所以,我开始实施org.eclipse.persistence.mappings.converters.Converter
,但我不知道如何实施convertObjectValueToDataValue
,initialize
和isMutable
方法...
有人可以解释一下如何实施这些方法吗?
现在,我的课就是这个:
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的自定义转换器,但这次谷歌不是我的朋友。
答案 0 :(得分:3)
好的,我在另一个项目中使用基本的SELECT语句进行了一些测试,我看到我的postgreSQL ENUM
类型返回为PGObject
,其值设置为my ENUM
的值(在我的情况下FR
,EN
或DE
)以及我的枚举名称的类型。
例如:如果我在pg:
中创建以下ENUM
CREATE TYPE langage AS ENUM ('FR', 'EN', 'DE');
我会收到价值为PGObject
或FR
或EN
且类型为DE
的{{1}}。
因此,当我想将Java对象转换为langage
时,我只需创建一个自定义EclipseLink ENUM
并在Converter
中返回PGObject
这样的内容:< / p>
convertObjectValueToDataValue
这很棒。
希望这有帮助。