2014年11月15日 星期六

EclipsLink's @Array on PostgreSQL does not work!?



最近開發的案子會需要使用PostgreSQL ARRAY 的功能,對於使用JPA 來說通常會有兩種選擇,一種是Hibernate ,一種是EclipseLink ,就因為看上EclipseLink 有支援@Array 的選項,就很開心的選用,沒想到這才是惡夢的開始....

老實說,第一次看到文件時是滿頭問號,首先看一下EclipseLink 官網wiki的介紹EclipseLink 對於PostgreSQL 的支援:

PostgreSQL supports structure data-types, JDBC Struct and Array types. These can be mapped using EclipseLink's @Struct and @Array annotations.

所以要使用ARRAY的型態就必須使用@Struct 和 @Array 兩個annotaion,那讓我們來看看他們的API文件:

EclipseLink - @Array 這部分的文件比較沒問題,的範例有提到必須在Entity Class 上加上@Struct 的annotation,只是他沒提到@Struct 裡面還有其他必填欄位,所以如果照他案例來寫,馬上Eclispe 就會告訴你有錯誤。

EclipseLink - @Struct 的API文件裡關於name 這個attribute的描述:
(Required) The database name of the database structure type
這段英文讓我很疑惑,到底是要填什麼東西?下面的範例跟這段話似乎也對不起來...
上網找了其他範例使用方式也都不盡相同....
嘗試了各種組合, 如果只使用@Array Table 會順利產生,不過table 內容似乎有問題,無法當正常當Array 使用,但是如果加了@Struct 則JPA就不會自動(且正確)的幫我們生成Table....


最後終於在這個討論串 - Postgresql - Creating PostgreSQL array types like "text[]" using JPA (EclipseLink) 看到也有人跟我遇到差不多的問題,原來這是一個Bug - Using @Array Tag in postgreSql,如果有嘗試要使用這個功能的人,可以持續關注這個bug或是找其他方法workaround吧...

目前使用的版本:
Spring-data-jpa 1.6.4
EclipseLink 2.5.2

如果有哪些大大知道解法,也麻煩跟我分享一下解法~XD
張貼留言