2014-12-29 93 views
1

這可能是一個愚蠢的問題,因爲現在的問題相當簡單,而且我確定答案很可能非常簡單。儘管如此,即使經過幾個小時的挖掘,我仍然無法找到解決我的問題的全面解決方案。使用ORMLite保存PostgreSQL自定義枚舉數據類型

我正在使用帶有Java的PostgreSQL數據庫的ORMLite。當我試圖將一個對象持久化到映射表時,自定義的Postgres枚舉數據類型似乎讓我頭疼。

下面的情況的一個示例:

的Java類被註釋如下:

@DatabaseTable(tableName = "customer") 
public class Customer { 

    @DatabaseField(id = true) 
    private int id; 

    @DatabaseField 
    private String name; 

    @DatabaseField(dataType = DataType.ENUM_STRING) 
    private CustomerType customerType; 
... 

枚舉定義如下:

public enum CustomerType{ 
    company, private, unknown 
} 

Postgres的數據類型(」 customertype「)定義爲枚舉類型(在pg_enum & pg_type表中),其值爲以下值:

"company" 
"private" 
"unknown" 

...和列本身是這樣類型的定義:

ALTER TABLE public.customer ADD COLUMN type customertype; 

當我嘗試插入使用ORMLite一個新行客戶表,我發現了以下異常,它告訴我,映射是一些什麼搞砸了ORMLite似乎不正確地處理值作爲VARCHAR,而不是自定義的枚舉類型:

org.postgresql.util.PSQLException: ERROR: column "type" is of type customertype but expression is of type character varying 

我只是介紹瞭如何正確有點困惑映射枚舉的t YPES。我已經嘗試了數據庫字段定義和其他持久規則的大部分不同數據類型,但沒有運氣。因爲它可能很明顯,我對ORMLite比較陌生,所以所有的幫助都不勝感激!

+0

一般來說,ORM與自定義數據庫類型播放不佳。將字符串類型設置爲unspecified可能會帶來一些好運;將'stringtype = unspecified'附加到您的JDBC參數。 –

+0

事實上,做了這個伎倆。謝謝! –

回答

0

一般來說,ORM與自定義數據庫類型的差別很大。

將字符串類型設置爲unspecified可能會帶來一些好運;將stringtype=unspecified附加到您的JDBC參數。這告訴PgJDBC發送類型爲java.sql.Types.VARCHAR的參數爲unknown,而不是默認的text。 PostgreSQL不會隱式地從text轉換爲enum,但它會從從未知類型的文字轉換爲枚舉。

在我看來,PostgreSQL在這裏的表現過於嚴格,但我還沒有太多的運氣來說服相關人員對pgsql-hackers有所瞭解。