PostgreSQL,枚举类型,JPA和EclipseLink

4
我想知道如何使用JPA Java枚举和PostgreSQL枚举类型进行映射?
在PostgreSQL端,我已经创建了这个类型:
CREATE TYPE langage AS ENUM ('FR', 'EN', 'DE');

我有一个Java枚举:

public enum LangageEnum {   
   FR,
   EN,
   DE;
}

我需要翻译的内容是:

我的JPA实体字段是这个:

@Enumerated(EnumType.STRING)
@Column(name="langage")
private LangageEnum langage = LangageEnum.FR;

但我收到了异常:

Caused by: org.postgresql.util.PSQLException: ERREUR: la colonne « langage » est de type pretoria.langage mais l'expression est de type character varying Indice : Vous devez réécrire l'expression ou lui appliquer une transformation de type。

我认为可以使用 ObjectTypeConverter,如此处所示here

但是ObjectTypeConverter是一个EclipseLink注释,不是JPA,因此我正在寻找另一种方法来解决这个问题。

那么,请问我如何将Java枚举映射到PostgreSQL枚举?


标准的JPA不支持自定义转换器。如果您不想使用eclipselink特定的转换器,那么您只能使用String或Integer。 - Christoph Leiter
我可以使用EclipseLink转换器。我想知道是否有更“传统”和抽象的方法来做到这一点。谢谢。 - Olivier J.
我无法成功...你能提供一些代码吗? - Olivier J.
1个回答

1
似乎您在Postgres中创建了一个枚举类型,但是表中的字段呢?
对我来说这个有效:
枚举
public enum CampaignState
{
    READY,
    RUNNING,
    PAUSED,
    FINISHED;
}

实体

...
@NotNull
@Enumerated(EnumType.STRING)
private CampaignState state = CampaignState.READY;
...

Table

CREATE TABLE campaign
(
    id UUID PRIMARY KEY,
    ...
    state CHARACTER VARYING(64) NOT NULL, -- defined by application
    ...
);

我希望这有所帮助。 >> 编辑 根据您的评论,请查看此答案

但是您使用的是varchar而不是用户定义类型。 - Christoph Leiter
是的,当在表中使用varchar时它可以工作,但我使用的是枚举类型语言,而不是varchar。无论如何,谢谢。 - Olivier J.
我理解你的观点,但是有几件事情我想提一下。如果你在数据库中定义了一个枚举类型,并在Java中对应一个相应的枚举,那么你可能会有重复的知识。这对于维护来说一点也不好。通过使用EnumType.STRING定义枚举字段并存储其字符串表示形式,你可以将知识保留在应用程序中。此外,JPA提供程序应该是与数据库无关的,因此Eclipselink允许你将枚举值保存为序数或字符串。如果你想保存字符串,varchar是正确的选择。这样做没有任何问题。 - rbento

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接