【问题标题】:PostgreSQL, enum, JPA, EclipseLinkPostgreSQL、枚举、JPA、EclipseLink
【发布时间】:2013-01-29 07:23:21
【问题描述】:

我想知道如何映射 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;

但我收到异常:

原因:org.postgresql.util.PSQLException: ERREUR: la Colonne « langage » est de type pretoria.langage mais l'expression est de type character varying 指数:Vous devez réécrire l'expression ou lui appliquer une transformation de type。

我想我可以成功使用ObjectTypeConverter 显示here

ObjectTypeConverterEclipseLink 注释,而不是JPA,所以我正在寻找另一种方法。

那么,我该如何将 Java 枚举映射到 PostgreSQL 枚举呢?

【问题讨论】:

  • 标准 JPA 不支持自定义转换器。如果您不想使用 eclipselink 特定的转换器,那您就不走运了,您必须使用 String 或 Integer。
  • 我可以使用 EclipseLink 转换器。我想知道是否有更“常规”和抽象的方式来做到这一点。谢谢
  • 我不能成功...你能有一些代码吗?

标签: postgresql jpa enums eclipselink


【解决方案1】:

好像你在Postgres中创建了一个枚举类型,但是表中的字段呢?

这对我有用:

枚举

public enum CampaignState
{
    READY,
    RUNNING,
    PAUSED,
    FINISHED;
}

实体

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

表格

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

希望对你有帮助。

>> 编辑

根据您的评论,请看一下这个answer

【讨论】:

  • 但是你使用的是 varchar 而不是用户定义的类型。
  • 是的,在表中使用 varchar 时它可以工作,但我使用的是枚举类型语言,而不是 varchar。无论如何谢谢
  • 我明白你的意思,但有几件事我可以提一下。如果你有一个在数据库中定义的枚举类型和一个在 Java 中对应的枚举,你可能有重复的知识。根本不利于维护。通过使用 EnumType.STRING 定义枚举字段并存储它的字符串表示,您可以将知识保存在应用程序中。此外,JPA 提供者应该与数据库无关,因此 Eclipselink 允许您将枚举值保存为序数或字符串。如果你想保存字符串,varchar 是要走的路。没有错。
猜你喜欢
  • 1970-01-01
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多