2013-02-13 170 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