2013-02-13 104 views
2

我想知道如何映射JPA Java枚举和PostgreSQL枚举类型?PostgreSQL,枚举,JPA,EclipseLink

在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 Indice:Vous devezréécrirel'expression ou lui appliquer une transformation de类型。

我想我可以使用ObjectTypeConverter作为显示here

ObjectTypeConverterEclipseLink注释,不JPA所以我在寻找另一种方式来做到这一点成功。

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

+0

标准JPA不支持自定义转换器。如果您不想使用eclipselink特定的转换器,那么您的运气不好,您必须使用String或Integer。 – 2013-02-13 17:04:09

+0

我可以使用EclipseLink转换器。我想知道是否有更多的“会议”和抽象的方式来做到这一点。 Thx – 2013-02-13 17:40:40

+0

我不能成功...请问您有一些代码吗? – 2013-02-13 21:33:19

回答

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

+0

但是你使用varchar而不是用户定义的类型。 – 2013-02-13 17:28:46

+0

是的,当在表中使用varchar时它工作,但我使用枚举类型语言,而不是varchar。 Thx无论如何 – 2013-02-13 17:39:03

+0

我明白你的观点,但有几件事情我可以提及它。如果你有一个在数据库中定义的枚举类型和一个在Java中的相应的枚举类型,你可能会有重复的知识。根本不适合维护。通过使用EnumType定义枚举字段。STRING并存储它的字符串表示形式,以便将知识保留在应用程序中。此外,JPA提供者应该是数据库不可知的,因此Eclipselink允许您将枚举值保存为序号或字符串。如果你想保存字符串,varchar是要走的路。没有错。 – rbento 2013-03-09 22:40:05